我试图快速调用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:_ :)-calling callback ...
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:_ :)-calling callback ...
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不同。我试图先叫第二个,然后立即处理了...
因此,我猜测这不是URL或数据问题,而是任务管理器问题?我还尝试使用静态共享TaskManager,最终得到相同的结果。
有人可以在这个问题上帮助我吗?我在网上找不到此问题。
我试图快速调用API,但是调用它时有延迟。我注意到更新视图时出现延迟,因此在每个函数中都放置了一些日志。顺便说一下,服务器的ping是... ...>
您可以通过检查响应的Request
属性来调查Alamofire metrics
的时间,该属性应告诉您所有网络事件的时间,而serializationDuration
可以告诉您序列化网络多长时间。反应了。但是,您可能需要做更多调查以了解时间的差异来自何处,因为可能是各种各样的事情。