AFNetworking:enqueueBatchOfHTTPRequestOperations问题与完成块

时间:2012-06-15 12:03:48

标签: iphone ios nsoperation nsoperationqueue afnetworking

我使用这种AFNetworking方法一次启动多个请求:

- (void)enqueueBatchOfHTTPRequestOperations:(NSArray *)operations 
                              progressBlock:(void (^)(NSUInteger numberOfCompletedOperations, NSUInteger totalNumberOfOperations))progressBlock 
                            completionBlock:(void (^)(NSArray *operations))completionBlock

其中一个是AFJSONRequestOperation。问题是此JSON操作的成功块是在批处理的完成块之后执行的。原因是:AFJSONRequestOperation具有用于JSON处理的内部调度队列。因此,在调用完成块时,JSON数据仍在处理中。

问题:在调用JSON操作的成功块之后,如何在完成块中执行代码?

我试图在主队列上调度一个代码块但是没有帮助。

3 个答案:

答案 0 :(得分:1)

如果可能,最简单的解决方案可能只是将处理代码从每个操作的成功块移动到整批的完成块。

您在完成块中有NSArray *operations可用,您可以遍历操作并查找:

for(AFHTTPRequestOperation *operation in operations){
   if(operation.response.statusCode == 200){
      //Do something with the response
   }else{
     //Handle the failure
   }
}

如果您需要执行不同的操作,还可以通过operation.request.URL属性获取每个操作的网址地址

答案 1 :(得分:0)

您可以将Json操作移动到队列的开头,然后添加一个依赖项,以便另一个操作只能在json操作完成后启动:

    [lastOperation addDependency:jsonOperation]

答案 2 :(得分:0)

似乎没有简单的方法可以完全按照OP的要求进行操作,所以这里有一些简单的解决方法。

一个相当直率的策略是使用AFHTTPRequestOperation代替AFJSONRequestOperation,然后使用NSJSONSerialization转换回复。

因此操作的成功块看起来像

  success:^(AFHTTPRequestOperation *operation, id responseObject){
              NSError *error ;
              id json = [NSJSONSerialization JSONObjectWithData:responseObject 
                                            options:kNilOptions error:&error] ;
              ... 
            }

警告将适用 - 对于大型JSON响应,这可能会阻止代码,而NSJSONSerialization问题的某些AFNetworking解决方法将不适用。但这会让你前进。

更新:下面的第一个评论者建议在批量完成功能块中使用AFJSONRequestOperation并在其上调用responseJSON。如果你的情况允许,我很擅长。在我当前的用例中,它使我的代码有些复杂化(我使用了一组混合的JSON调用,因此如果我可以将代码保存在与操作直接相关的success块中,则代码更清晰。)