【问题标题】:NSURLSessionTaskPriority seems to be ignored?NSURLSessionTaskPriority 似乎被忽略了?
【发布时间】:2016-09-30 09:32:51
【问题描述】:

在此示例中,我以默认优先级启动 100 NSURLSessionDataTask,然后将最后一个设置为高优先级。但是它似乎根本没有任何效果,因为最后一个任务仍然最后运行。

NSURLSession *session = ...
NSURLRequest *request = ...

for (int i = 1; i<=100; i++) {
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSLog(@"%d", i);
    }];
    if (i == 100) {
        dataTask.priority = NSURLSessionTaskPriorityHigh;
    }
    [dataTask resume];
}

为什么这个具有高优先级的任务没有在其他 99 个默认优先级之前运行?我希望在添加高优先级任务之前可能会开始执行一些较早的任务,但不是全部。

我什至尝试过将 HTTPMaximumConnectionsPerHost 设置为 1,没有区别。

【问题讨论】:

  • 是上传任务还是下载任务?

标签: objective-c nsurlsession nsurlrequest nsurlsessiontask


【解决方案1】:

您的服务器需要支持 HTTP/2。
NSURLSessionTaskPriority 是 HTTP/2 优先级帧/依赖权重的包装器。

NSURLSession's support of HTTP/2

【讨论】:

  • 这可能是真的,但这不是我问题的答案。请参阅上面的其他答案。
  • @trapper 实际上,我的回答解释了为什么 hint 不起作用。
  • 不,抱歉,不是,这是客户端问题。在低优先级任务全部完成之前,甚至不会尝试启动高优先级任务。
【解决方案2】:

优先级不会影响应用端的优先级。 提示 主机响应优先级的多个请求。宿主完全可以忽略这一点。

要向主机提供提示关于如何从您的应用程序中确定 URL 会话任务的优先级,请为每个任务指定一个优先级。指定优先级仅提供提示,不保证性能。 […]

[…]

您可以随时指定或更改任务的优先级,但并非所有网络协议都会在任务开始后响应更改。没有 API 可让您从主机的角度确定任务的有效优先级。

【讨论】:

  • 看来我完全误解了这一点。优先级对队列顺序完全没有影响,最后添加的高优先级任务将最后启动。完全没用,哈哈
  • 不,不是没用,因为是传给主机的。但是,主机而不是客户端决定何时发送下载数据。
  • 但是直到100个低优先级任务已经完成后才会传输到主机。完全没用。因此,如果我想优先完成某些事情,我需要使用单独的 NSURLSession。
  • 您有多个并行请求,并想告诉主机,he 应该以更高的优先级服务哪个请求。请记住,当服务器发送大量数据时,由他决定先发送哪些数据。在这种情况下,客户端将首先收到高优先级的数据。
  • @AminNegm-Awad 我对此有疑问。我正在用不同的 NSURLSessionTaskPriority 值嗅探我的请求。但我看不出它们之间有什么区别。 (至少在 HTTP 层)你知道这个优先级是如何传递给主机的吗?
猜你喜欢
  • 2021-10-28
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 2012-03-08
  • 2015-12-11
  • 2014-04-15
  • 1970-01-01
相关资源
最近更新 更多