NSURLSession delegateQueue 的 maxConcurrentOperationCount 如何影响任务并发

Posted

技术标签:

【中文标题】NSURLSession delegateQueue 的 maxConcurrentOperationCount 如何影响任务并发【英文标题】:How does the maxConcurrentOperationCount of the NSURLSession delegateQueue effects task concurency 【发布时间】:2016-10-01 13:37:40 【问题描述】:

我正在使用 AFNetworking 3.0,它使用 NSURLSessionDataTask 和一个 operationQueue(AFURLSessionManager 的属性),用作 NSURLSession 的委托队列

简单地说

AFURLSessionManager.operationQueue == NSURLSession.delegateQueue

AFNetworking 3 代码

self.operationQueue = [[NSOperationQueue alloc] init];
self.operationQueue.maxConcurrentOperationCount = 1;
self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];

来自 Apple 文档。到 NSURLSession 委托队列

用于调度委托调用和完成处理程序的操作队列。队列不必是串行队列。如果为 nil,则会话创建一个串行操作队列,用于执行所有委托方法调用和完成处理程序调用。

设置self.operationQueue.maxConcurrentOperationCount = 4; 意味着会有最大值。 4同时处理NSURLSessionDataTask?并将其设置为 = 1(AFNetworking 的默认值)意味着当时只有一个任务,并且必须完成才能开始另一个任务?

或者我错了,这只会影响委托消息传递,这意味着将其设置为 4 可以触发 4 个不同线程上的委托回调......而设置为 1 意味着回调始终在同一个线程上, 但无论如何这些任务都是同时处理的

【问题讨论】:

上述 Apple 文档的引用中有错字吗?而不是“队列不必是串行队列”,而应该是“队列应该是串行队列”。太明显了,我不敢编辑它,因为害怕我错过了什么。 developer.apple.com/documentation/foundation/nsurlsession/… 【参考方案1】:

那个队列是委托队列,所以它应该只影响委托消息传递。

当你创建一个NSURLSession 时,你给它一个NSURLSessionConfiguration 类型的配置对象。

NSURLSessionConfiguration 包含一个属性HTTPMaximumConnectionsPerHost,可让您控制与单个主机的同时连接数。这是我所知道的唯一可以让您控制连接数量的机制。

【讨论】:

太好了,感谢您指出 HTTPMaximumConnectionsPerHost,这也应该反映在 AFNetworking 中,因为 operationQueue 属性非常具有误导性 我刚刚对你在那个 github 板上的评论发表了评论。并不是说 AFNetworking 的 operationQueue 属性不应该是公开的;只是它的名字很糟糕,因此会产生误导和混淆。 顺便说一句。 HTTPMaximumConnectionsPerHost = 1 当时似乎并没有保持一个连接,甚至看起来它被忽略了,因为当我在一个循环中达到 100 个请求时,服务器几乎同时收到 100 个请求,所以也许一个连接可以服务器多个请求同时...

以上是关于NSURLSession delegateQueue 的 maxConcurrentOperationCount 如何影响任务并发的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSession 委托跨类拆分 - NSURLSession、NSURLUploadTask、NSURLDownloadTask

iOS开发系列-NSURLSession

学习NSURLSession

NSURLSession各文件关系

iOS开发-NSURLSession

NSURLSession学习