我正在使用AFNetworking从服务器获取数据:
-(NSArray)some function {
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSArray *jsonArray =[JSON valueForKey:@"posts"];
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {}
}
所以我在这里要做的是将jsonArray返回给函数。显然回报不起作用。
答案 0 :(得分:19)
您无法使用完成块为方法创建返回值。 AFJSONRequestOperation
以异步方式完成工作。当操作仍然有效时,someFunction
将返回。成功和失败块是你如何得到他们需要去的结果值。
这里的一个选项是将调用者作为参数传递给包装器方法,以便完成块可以关闭数组。
- (void)goFetch:(id)caller
{
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
[caller takeThisArrayAndShoveIt:[JSON valueForKey:@"posts"]];
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {}
}
您还可以让您的来电者创建并传递阻止成功运行。然后goFetch:
不再需要知道调用者上存在哪些属性。
- (void)goFetch:(void(^)(NSArray *))completion
{
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
if( completion ) completion([JSON valueForKey:@"posts"]);
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {}
}
答案 1 :(得分:3)
正如其他人所说,在处理异步调用时你不能这样做。您可以将完成块作为参数传递
,而不是返回预期的Arraytypedef void (^Completion)(NSArray* array, NSError *error);
-(void)someFunctionWithBlock:(Completion)block {
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSArray *jsonArray =[JSON valueForKey:@"posts"];
if (block) block(jsonArray, nil);
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
if (block) block(nil, error);
}
}
然后你称之为someFunction。此代码也将为您执行正确的错误处理。
[yourClassInstance someFunctionWithBlock:^(NSArray* array, NSError *error) {
if (error) {
NSLog(%@"Oops error: %@",error.localizedDescription);
} else {
//do what you want with the returned array here.
}
}];
答案 2 :(得分:0)
我遇到了这种问题并通过以下方法解决了这个问题。 我用块看到了上面的答案。但是这个解决方案当时更适合。 该方法的逻辑很简单。您需要将对象及其方法作为参数发送,并在请求完成后调用该方法。 希望它有所帮助。
#<Dmessage id: nil, decrypted: nil, created_at: nil, updated_at: nil>