12

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

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

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

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

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

4

3 回答 3

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如果您需要执行不同的操作,您还可以通过该属性获得每个操作的 url 地址

于 2012-06-15T23:31:19.733 回答
0

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

一个相当直截了当的策略是使用AFHTTPRequestOperation而不是,AFJSONRequestOperation然后使用NSJSONSerialization.

所以操作的成功块看起来像

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

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

更新:下面的第一个评论者建议在批处理完成块中使用AFJSONRequestOperation和调用它。responseJSON如果你的情况允许,我很好。在我当前的用例中,它使我的代码有些复杂(我正在使用一组混合的 JSON 调用,因此如果我可以将其保存在success与操作直接关联的块中,代码会更清晰)。

于 2013-12-02T23:14:28.877 回答
0

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

    [lastOperation addDependency:jsonOperation]
于 2013-06-27T08:08:16.373 回答