优先安排iOS上的网络通话

Seb*_*jas 5 ios nsurlsession swift urlsession

我想充分利用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
Run Code Online (Sandbox Code Playgroud)

问题是,我仍然看到优先级为0.0的下载任务一开始就从优先级为1.0的任务中占用了大量负载(最多〜60%)。有时,只有当大量低优先级请求完成时才开始优先级为1.0的呼叫。Apple的(文档)确认:

要向主机提供有关如何确定应用中URL会话任务优先级的提示,请为每个任务指定优先级。指定优先级仅提供提示,并不保证性能。[...]没有API可让您从主机的角度确定任务的有效优先级。

我想实现假定的下载和缓存,而又不降低用户发起的请求的性能。这对于连接不良的设备尤其重要。

我考虑过的解决方案:

  • 使用Alamofire(但是afaik他们也没有优先级)
  • 创建一个自定义解决方案,该解决方案仅允许n并行下载,具有优先级队列,并在高优先级请求进入时中止/暂停非常低优先级的请求。但是,对我来说,这听起来像已经必须存在,并且有点像如果实施不当,这是一种绝佳的射击方式。

我考虑过的替代方法:

  • 仅在最重要的呼叫完成后才开始不太重要的呼叫
  • 根本不对连接不良进行请求(后续问题将是如何确定连接不良)

我支持iOS 9和更高版本,但也会考虑在iOS 9上不起作用的解决方案。

Ant*_*tzi 0

正如苹果在文档中提到的,优先级字段只是一个提示,并不能真正保证资源将如何使用。

更严格地执行网络优先级;正如您所提到的,唯一的可能性是限制并发请求的数量。这实际上就是 Alamofire 图像缓存库正在做的事情

Alamofire 不支持设置 NSURLSessionTask 优先级值之外的优先级。