ios - URLSession dataTask 长时间延迟
问题描述
当我从我的代码中请求 API 时,我在 4-6 秒后得到了响应,这太长了。邮递员在 120 毫秒后收到回复。我的代码中有什么地方出错了吗?这是我的代码,我正在检查这两个打印之间的时间:
func makeUrlRequest<T: Codable>(_ request: URLRequest, resultHandler: @escaping (Result<T, RequestError>) -> Void) {
var req = request
req.addValue("application/json", forHTTPHeaderField: "Content-Type")
req.addValue("application/json", forHTTPHeaderField: "Accept")
let config = URLSessionConfiguration.default
let urlSession = URLSession(configuration: config, delegate: self, delegateQueue: .main)
print("Request: start at: \(Date())") //Request: start at: 2021-04-09 06:53:32 +0000
let urlTask = urlSession.dataTask(with: req) { data, response, error in
print("Request: finished at: \(Date())") //Request: finished at: 2021-04-09 06:53:36 +0000
DispatchQueue.main.async {
guard error == nil else {
resultHandler(.failure(.clientError))
return
}
guard let response = response as? HTTPURLResponse, 200...299 ~= response.statusCode else {
resultHandler(.failure(.serverError))
return
}
guard let data = data else {
resultHandler(.failure(.noData))
return
}
guard let decodedData: T = self.decodedData(data) else {
resultHandler(.failure(.dataDecodingError))
return
}
resultHandler(.success(decodedData))
}
}
urlTask.resume()
}
解决方案
代替
let urlSession = URLSession(configuration: config, delegate: self, delegateQueue: .main)
print("Request: start at: \(Date())") //Request: start at: 2021-04-09 06:53:32 +0000
let urlTask = urlSession.dataTask(with: req) { data, response, error in...
你应该使用
let task = URLSession.shared.dataTask(with: req) { (data, response, error) in...
编辑:
我看到您想使用委托。在这种情况下,您不应使用完成处理程序,而应添加委托方法:
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)
查看 Apple 的文档以获取更多信息。
推荐阅读
- python-3.x - Python Selenium 元素不可交互
- sockets - 使用 saga 生成器从 phoenix socket push 获取响应数据
- c# - 在抽象基类的帮助下避免 DRY 违规。如何重构它?寻找替代方案/论据
- ios - 重新加载数据时 Tableview 为零
- r - 如果我有一个想要修改和更改其值的现有列,我如何使用 R 设置条件语句?
- oracle-cloud-infrastructure - Oracle 云实例连接问题
- javascript - 将删除按钮添加到列表
- elasticsearch - Elasticsearch 未填充时间戳/无法在 kibana 可视化中更改时间戳过滤器
- javascript - 尝试使用 node.js 将文件中的数据插入 mongodb。数据插入但本地主机页面未加载显示我的结束消息?
- php - 从第二级数组获取 ID 值