NSURLSession代理队列中的maxConcurrentOperationCount如何影响任务并发性?

5

我正在使用AFNetworking 3.0,它使用NSURLSessionDataTask,并且还有一个操作队列(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];

从苹果文档中,到 NSURLSession delegateQueue:
一个操作队列,用于安排委托调用和完成处理程序。队列不必是串行队列。如果为nil,则会话将创建一个串行操作队列,用于执行所有委托方法调用和完成处理程序调用。
设置 self.operationQueue.maxConcurrentOperationCount = 4 ,这意味着最多有4个同时处理的 NSURLSessionDataTask 吗?而将其设置为1(AFNetworking 的默认值)意味着同一时间只有一个任务,并且必须完成另一个任务后才能开始下一个吗?
或者我错了,这只影响委托消息传递,这意味着将其设置为4可以在4个不同的线程上触发委托回调...而将其设置为1表示回调始终在同一线程上,但是任务仍然被并发处理。

上面的苹果文档引用中是否有错别字?应该是“队列应该是串行队列”,而不是“队列不需要是串行队列”。这一点非常明显,我不敢编辑它,因为我担心会漏掉什么。https://developer.apple.com/documentation/foundation/nsurlsession/1411597-sessionwithconfiguration - SimSim
1个回答

6
那个队列是代理队列,所以它应该只影响代理消息传递。
创建一个 NSURLSession 时,您需要提供一个类型为 NSURLSessionConfiguration 的配置对象。
NSURLSessionConfiguration 包括一个名为 HTTPMaximumConnectionsPerHost 的属性,可以让您控制与单个主机的同时连接数。这是我所知道的唯一控制连接数的机制。

非常感谢您指出HTTPMaximumConnectionsPerHost,这也应该在AFNetworking中得到体现,因为operationQueue属性相当具有误导性。 - Peter Lapisu
1
我刚在那个 Github 讨论版上回复了你的评论。问题不在于 AFNetworking 的 operationQueue 属性不应该是公共的;而是它的命名不够清晰,容易引起误解和混淆。 - Duncan C
顺便提一下,HTTPMaximumConnectionsPerHost = 1 似乎不能保持一次单一连接,甚至看起来被忽略了,因为当我在循环中发送100个请求时,服务器几乎同时收到了100个请求,所以也许一个连接可以同时服务多个请求... - Peter Lapisu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接