Obj-C:将方法参数传递给嵌套块

时间:2014-08-27 00:10:23

标签: ios objective-c afnetworking

我正在使用AFNetworking来使用一些JSON数据。我必须在许多视图控制器中执行此操作。我正在尝试重构我的代码并删除一些重复。我想知道如何将NSArray对象传递给AFHTTPRequestOperation的完成块?

我尝试过以下无效。

-(void)request:(NSArray *)jsonArray
{
    // ...

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    operation.responseSerializer = [AFJSONResponseSerializer serializer];
    [operation setCompletionBlockWithSuccess:
     ^(AFHTTPRequestOperation *operation, id responseObject) {
         jsonArray = responseObject;

         dispatch_async(dispatch_get_main_queue(),
                        ^{
                            [self.tableView reloadData];
                        }
                        );
     }
                                     failure:
     ^(AFHTTPRequestOperation *operation, NSError *error) {

         NSLog(@"Request Failed: %@, %@", error, error.userInfo);
     }
     ];

    [operation start];
}

3 个答案:

答案 0 :(得分:0)

听起来您希望jsonArray成为out方法参数,因此您可以在方法中设置其值。对于像你这样的异步请求,这是非常气馁的,但仍然如此。

您的方法定义将更改为:

-(void)request:(out NSArray **)jsonArray;

对此方法的调用将更改为:

[object request:&anArray];

你的完成处理程序会将数组设置为:

*jsonArray = responseObject;

对于它的价值,我同意CrimsonChris的观点,他建议使用回调块来正确处理这个问题。

答案 1 :(得分:0)

如果我理解你,我建议你这样做:

-(void)request:(NSArray *)jsonArray 
   compltition:(void(^)(NSDIctionary *response))complition {
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
[operation setCompletionBlockWithSuccess:
 ^(AFHTTPRequestOperation *operation, id responseObject) {
     jsonArray = responseObject;

     dispatch_async(dispatch_get_main_queue(),
                    ^{
                        //returning response 
                         complition(response);
                        [self.tableView reloadData];
                    }
                    );
 }
                                 failure:
 ^(AFHTTPRequestOperation *operation, NSError *error) {

     NSLog(@"Request Failed: %@, %@", error, error.userInfo);
 }
 ];

[operation start];
}

以及你在哪里调用这个函数:

[self request:jsonArray complition:^(NSDictionary *response) {
NSLog(@"Response = %@, response")
//and you can parse and reload your table
}];

答案 2 :(得分:0)

我通过在助手类中定义函数来解决这个问题,使jsonArray成为该类的实例变量,而不是函数参数。