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