使用模拟数据测试URLSession代理方法
规整后的URLSession代理方法实现
嘿,我来帮你把这两个URLSession代理方法的实现理清楚并规整好——这俩方法可是网络请求里处理数据接收和任务收尾的核心环节。你给出的代码片段已经有了核心逻辑,我把它补全并整理成更易读的完整版本:
首先,我们需要一个实例变量来累加分块接收的数据(因为网络数据可能不是一次性传完的):
private var dataReceived = Data()
1. 接收数据的代理方法
这个方法会在数据分块到达时被调用,我们要做的就是把每次收到的数据追加到之前的缓存里:
public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { // 累加收到的分块数据 dataReceived.append(data) }
2. 任务完成的代理方法
当请求结束(不管成功、失败还是遇到HTTP错误),这个方法会被触发,我们在这里处理错误、HTTP状态码和最终的数据:
public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { // 先处理网络层面的错误(比如无网络、连接超时等) if let error = error { print("请求发生错误: \(error.localizedDescription)") // 这里可以添加错误回调、弹窗提示等自定义逻辑 return } // 网络请求成功,解析HTTP响应和数据 guard let response = task.response as? HTTPURLResponse, !dataReceived.isEmpty else { print("无效的响应或无返回数据") return } // 根据HTTP状态码分支处理 switch response.statusCode { case 200...299: // 成功状态码,处理返回的数据 print("请求成功,返回数据大小: \(dataReceived.count) bytes") // 这里可以解析dataReceived为JSON、模型对象等自定义逻辑 do { let json = try JSONSerialization.jsonObject(with: dataReceived, options: []) print("解析后的JSON: \(json)") } catch { print("JSON解析失败: \(error)") } case 400...499: // 客户端错误(比如参数错误、权限不足等) print("客户端错误,状态码: \(response.statusCode)") // 可以解析错误信息返回给用户 case 500...599: // 服务器错误 print("服务器错误,状态码: \(response.statusCode)") default: print("未知状态码: \(response.statusCode)") } // 重置缓存,为下一次请求做准备 dataReceived = Data() }
一些实用提示
- 要确保你的
URLSession实例初始化时设置了正确的代理(比如URLSession(configuration: .default, delegate: self, delegateQueue: nil)) dataReceived一定要在每次请求完成后重置,避免不同请求的数据互相污染- 如果需要并发处理多个请求,建议用字典来存储每个task对应的数据(比如
[URLSessionTask: Data]),避免单个变量的冲突
内容的提问来源于stack exchange,提问作者SwiftyJD
相关产品推荐
相关产品推荐

