在运行AFHTTPSessionManager的AFNetworking 2中设置并发任务限制

16
我知道在旧版AFNetworking中可以使用AFHTTPClient实现,同时我知道如果使用AFHTTPRequestOperationManager可以设置队列的限制,但是如果不使用成功块(我不想使用),无法使AFHTTPSessionManager仅同时运行x个请求。
以下代码没有限制我的连接:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.operationQueue.maxConcurrentOperationCount = 1;
根据此处的有趣讨论,我向服务器发送了大量请求并导致超时,因此我确实需要限制我的并发连接。
我漏掉了什么?
2个回答

23

AFHTTPSessionManager使用任务而不是操作(具体来说是NSURLSessionDataTask),这就是为什么您无法设置操作队列的原因。

正如您在此类的实现中所看到的,任务会立即启动([task resume]),而不会添加到任何类型的队列中。

因此,不幸的是,在AFHTTPSessionManager中没有内置的方式来设置并发任务数量的限制。

可能的替代方案:

  1. 改用AFHTTPRequestOperationManager(这是我正在做的)
  2. 构建一个NSOperation子类,该子类具有任务作为属性,并在您的子类的[operation start]方法中启动任务
  3. 创建一个Grand Central串行队列,并在此队列中创建和启动任务
  4. 如果您的请求都针对同一主机,请直接访问基础URL加载系统中的HTTPMaximumConnectionsPerHost选项,例如:

    [NSURLSessionConfiguration defaultSessionConfiguration].HTTPMaximumConnectionsPerHost = 4;
    

    这种方法有一些注意事项,在苹果文档中有讨论。

  5. 如果你最终采用第二种方法,请将其作为拉取请求提交给AFNetworking - 欢迎加入。


谢谢您的详细答复,我最终选择了第一种方法,因为它是最简单的。 - shaioz
@LeszekS 仍然是一样的。 - Aaron Brager
@AaronBrager 在 AFNetworking 3 中,由于 AFHTTPRequestOperationManager 被移除了,是否会有一个选项来设置 AFHTTPSessionManager 上的最大并发操作数? - adamup
@adamup 看起来不是这样。 - Aaron Brager
如果您仍需要在AFNetworking 3中使用maxConcurrentOperationCount,则可以查看我的fork https://github.com/fins/AFNetworking并使用AFHTTPOperationSessionManager代替AFHTTPSessionManager。它将任务封装在NSOperations中,因此您可以将requestsOperationQueue.maxConcurrentOperationCount设置为任何您需要的值 :) 如果您正在使用pods,则只需像这样编辑podfile:pod'AFNetworking',:git =>'https://github.com/fins/AFNetworking.git' - Leszek Szary

3
您可以配置 AFHTTPSessionManagerNSURLSessionConfiguration:
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.HTTPMaximumConnectionsPerHost = 2;

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:config];

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