我正在使用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];
}
答案 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
成为该类的实例变量,而不是函数参数。