【发布时间】:2020-09-11 08:19:02
【问题描述】:
我正在尝试快速调用 API,但调用时出现延迟。我注意到更新视图时的延迟,所以我在每个函数中放置了一些日志。顺便说一下,服务器的ping是80ms左右,我已经在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 秒的延迟),所以我的界面不会很快更新。 2 个视图使用相同的请求函数,但 URL 不同。 我试着先打电话给第二个,它立即被处理了......
所以我猜这不是 url 或数据的问题,而是任务管理器的问题?我也尝试使用静态共享任务管理器,结果相同。
谁能帮我解决这个问题?我在网上找不到这个问题。
【问题讨论】:
标签: ios swift api alamofire urlsession