我尝试用 swift 调用 API,但调用时出现延迟。我注意到更新视图时存在延迟,因此我在每个函数中放置了一些日志。顺便说一句,服务器的 ping 约为 80 毫秒,我已经在
DispatchQueue.main.async
中更新我的视图
我尝试了 URLSession 和 Alamofire(应该嵌入 URLSession),
URLSession 请求代码:
func getAPIContent(urlAPI: String, _ callbackFunction: @escaping (Data) -> ()) {
logMessage("start get API at url : " + urlAPI)
let session = URLSession.shared
let url = URL(string: urlAPI)!
let task = session.dataTask(with: url) { data, response, error in
if error != nil || data == nil {
print("Client error!")
return
}
guard let response = response as? HTTPURLResponse, (200...299).contains(response.statusCode) else {
print("Server error!")
return
}
guard let mime = response.mimeType, mime == "application/json" else {
print("Wrong MIME type!")
return
}
DispatchQueue.main.async {
logMessage("calling callback...")
callbackFunction(data!)
}
}
logMessage("launching api task...")
task.resume()
}
Alamofire 请求代码(错误未处理):
func getAPIContent2(urlAPI: String, _ callbackFunction: @escaping (Data) -> ()) {
logMessage("alamofire request")
let request = AF.request(urlAPI)
request.responseData { (response) in
DispatchQueue.main.async {
logMessage("calling callback...")
callbackFunction(response.value!)
}
}
}
这是我得到的典型结果(我为此日志使用了 getAPIContent2()):
由 /Users/lucien/Documents/table1/table1/utilities.swift 调用 - getAPIContent2(urlAPI:_:) - alamofire 请求 2020 年 5 月 24 日星期日,地址: 19:12:07 中欧夏令时间
由 /Users/lucien/Documents/table1/table1/utilities.swift 调用 - getAPIContent2(urlAPI:_:) - 调用回调... 2020 年 5 月 24 日星期日,地址: 19:12:08 中欧夏令时间
由 /Users/lucien/Documents/table1/table1/TableViewController.swift 调用 - displayLines(networkData:) - 开始显示所有行 5 月 24 日星期日 2020 年 19:12:08 中欧夏令时间
由 /Users/lucien/Documents/table1/table1/utilities.swift 调用 - getAPIContent2(urlAPI:_:) - alamofire 请求 2020 年 5 月 24 日星期日,地址: 19:12:09 中欧夏令时间
由 /Users/lucien/Documents/table1/table1/utilities.swift 调用 - getAPIContent2(urlAPI:_:) - 调用回调... 2020 年 5 月 24 日星期日,地址: 19:12:14 中欧夏令时间
由 /Users/lucien/Documents/table1/table1/AddLineViewController.swift 调用 - displayDestinations(allStopsData:) - 开始显示目的地周日 2020 年 5 月 24 日 19:12:14 中欧夏令时间
您可以注意到,第一个调用会立即处理(并且视图会立即更新),但是第二个调用在 Alamofire 请求 (19:12:09) 和完成处理程序 (19:12:14) 之间有 5 秒的延迟,所以我的界面更新得不太快。这两个视图使用相同的请求函数,但 URL 不同。 我尝试先拨打第二个电话,但它立即被处理了......
所以我猜这不是网址或数据的问题,而是任务管理器的问题?我还尝试使用静态共享任务管理器,最终得到相同的结果。
任何人都可以帮助我解决这个问题吗?我在网上找不到这个问题。
您可以通过检查响应的
Request
属性来调查 Alamofire metrics
的时间,它应该告诉您所有网络事件的时间,以及 serializationDuration
,它应该告诉您序列化响应需要多长时间采取了。但您需要进行更多调查,看看时间差异来自何处,因为可能有多种原因。