我想利用 iOS 上网络调用的良好优先级。
到目前为止,我正在使用URLSessionTask.priority
. 我创建这样的网络调用:
URLSession.shared.dataTask(with: request) { data, response, error in
if let data = data, let response = response {
// Handle response
} else {
// Handle error
}
}
task.priority = priority
问题是我仍然看到优先级为 0.0 的下载任务一旦开始就会从优先级为 1.0 的任务中承担大量负载(高达约 60%)。有时,优先级为 1.0 的调用仅在完成大量低优先级请求时才开始。苹果的(文档)证实:
要向主持人提供有关如何为您的应用程序中的 URL 会话任务优先级的提示,请为每个任务指定优先级。指定优先级仅提供提示,并不能保证性能。[...] 没有 API 可以让您从主机的角度确定任务的有效优先级。
我想实现假定下载和缓存,而不降低用户发起请求的性能。这对于连接性较差的设备尤其重要。
我考虑过的解决方案:
- 使用 Alamofire(但 afaik 他们也没有优先级)
- 创建一个自定义解决方案,只允许
n
并行下载,具有优先级队列,并在高优先级请求进入时中止/暂停非常低优先级的请求。不过,对我来说,这听起来像是必须已经存在的东西,也有点像如果实施不当,这是一种将自己射中脚的绝妙方法。
我考虑过的替代方案:
- 仅在最重要的呼叫完成后才开始不太重要的呼叫
- 根本不要在连接不良时发出请求(后续问题是如何识别不良连接)
我支持 iOS 9 和更新版本,但也会考虑不适用于 iOS 9 的解决方案。