【问题标题】:setting limit on concurrent tasks in AFNetworking 2 running AFHTTPSessionManager在运行 AFHTTPSessionManager 的 AFNetworking 2 中设置并发任务限制
【发布时间】:2014-02-20 03:05:01
【问题描述】:

所以我知道在旧的 AFNetworking 中,这可以使用 AFHTTPClient, 而且我知道如果我使用 AFHTTPRequestOperationManager 我可以设置队列的限制,但我不能让 AFHTTPSessionManager 一次只运行 x 个请求,而无需自己使用成功块(我不想这样做)实现它。

以下代码并未限制我的连接:

AFHTTPSessionManager *manager = [AFHTTPSessionManager 管理器]; manager.operationQueue.maxConcurrentOperationCount = 1;

根据一个有趣的讨论 here,我对我的服务器有很多请求,我会阻塞它直到超时,所以我真的需要限制我的并发连接数。

我错过了什么?

【问题讨论】:

    标签: ios network-programming afnetworking afnetworking-2 nsurlsession


    【解决方案1】:

    你可以配置AFHTTPSessionManagerNSURLSessionConfiguration:

    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    config.HTTPMaximumConnectionsPerHost = 2;
    
    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:config];
    

    【讨论】:

      【解决方案2】:

      AFHTTPSessionManager 使用任务而不是操作(特别是NSURLSessionDataTask),这就是您不能设置操作队列的原因。

      正如您在the implementation of this class 中看到的,任务会立即启动 ([task resume]),并且不会添加到任何类型的队列中。

      因此,不幸的是,没有内置的 AFNetworking 方法可以使用 AFHTTPSessionManager 设置并发任务的数量限制。

      可能的替代方案:

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

        [NSURLSessionConfiguration defaultSessionConfiguration].HTTPMaximumConnectionsPerHost = 4;
        

        这种方法有许多注意事项,在the Apple documentation 中进行了讨论。

      如果您最终完成了 #2,请将其作为拉取请求提交给 AFNetworking - 这将是一个受欢迎的补充。

      【讨论】:

      • 谢谢你的详细回答,我最终做了#1,这是最简单的。
      • @LeszekS 还是一样。
      • @AaronBrager 自从AFHTTPRequestOperationManager 被删除后,AFNetworking 3 中是否有设置AFHTTPSessionManager 的最大并发操作数的选项?
      • 如果您在 AFNetworking 3 中仍然需要 maxConcurrentOperationCount,那么您可以查看我的 fork github.com/fins/AFNetworking 并使用 AFHTTPOperationSessionManager 而不是 AFHTTPSessionManager。它将任务包装在 NSOperations 中,因此您可以将 requestsOperationQueue.maxConcurrentOperationCount 设置为您需要的任何内容:) 如果您使用的是 pod,那么您可以像这样编辑 podfile:pod 'AFNetworking', :git => 'https://github.com/fins/AFNetworking.git'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      • 2021-06-16
      • 1970-01-01
      相关资源
      最近更新 更多