使用 AFNetworking 2.0 对请求进行分组或批量处理

Posted

技术标签:

【中文标题】使用 AFNetworking 2.0 对请求进行分组或批量处理【英文标题】:Group or batch requests with AFNetworking 2.0 【发布时间】:2013-12-30 19:44:58 【问题描述】:

我正在尝试找出使用 AFNetworking 2.0 对多个 GET 请求进行分组或批处理的最佳做法。在代码可以继续之前,所有的 GET 请求都需要完成,但它们不必一个接一个地运行。现在对于单个请求,我使用的是AFHTTPRequestOperationManager(另请参见此处:Subclass AFHTTPRequestOperationManager?)。

这里描述了一种可能性,使用 dispatch_group:How to batch request with AFNetworking 2?,但这是针对AFHTTPSessionManager,仅适用于 ios7。我的应用仍然以 iOS6 为目标,所以我需要使用 AFHTTPRequestOperationManager

是使用 dispatch_group 的方式吗?或者我忽略了 AFNetworking 中的某些内置内容并且可以用于此目的?

编辑:仍然不知道正确的方法是什么......例如,我如何使用AFHTTPRequestOperation 的组?

我尝试了以下方法,但最终的 NSLog(“完成搜索”)总是在所有响应进入之前首先显示:

dispatch_queue_t dispatch_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t dispatch_group = dispatch_group_create();

for (Entry *e in self.entries)

    dispatch_group_async(dispatch_group, dispatch_queue, ^
        NSString *queryString = [e getQueryString];         
        NSURL *URL = [NSURL URLWithString: queryString];
        NSURLRequest *request = [NSURLRequest requestWithURL:URL];

        AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
        operation.responseSerializer = [AFHTTPResponseSerializer serializer];
        operation.completionGroup = dispatch_group;
        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 
            NSLog(@"%@", responseObject);
         failure:nil];

        [operation start];
    );


dispatch_group_notify(group, dispatch_get_main_queue(), ^
    NSLog(@"done searching");
);

【问题讨论】:

【参考方案1】:

经过大量尝试,我想出了以下内容,这正是我所需要的。所有AFHTTPRequestOperation 调用都由单例客户端处理:

dispatch_group_t dispatchGroup = dispatch_group_create();

for (Entry *e in self.entries)

    dispatch_group_enter(dispatchGroup);

    MyDBClient *dbClient = [MyDBClient sharedClient];

    [dbClient searchForQuery: queryString
                   withParameters: nil
                       completion: ^(NSData *data, NSError *error) 
                           if (data) 
                               // process data
                                                          
                           else 
                               // deal with error, if any
                                                         
                           dispatch_group_leave(dispatchGroup);
                       ];


dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^
  // update UI here
);

客户端中的代码基于我在这里找到的示例代码:http://nsscreencast.com/episodes/91-afnetworking-2-0

我希望这可以帮助其他正在尝试实现相同目标的人。

【讨论】:

以上是关于使用 AFNetworking 2.0 对请求进行分组或批量处理的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 2.0 JSON 漏洞防护

AFNetworking 2.0 POST 请求无法快速工作

使用 AFNetworking 2.0 的 POST 请求 - AFHTTPSessionManager

如何使用 AFNetworking-2.0 执行 JSON 编码的 GET 请求?

AFNetworking 2.0 多部分请求正文空白

AFNetworking 2.0 和请求标头