函数返回块内的值

我正在使用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返回给函数。 显然返回不起作用。

您不能使用完成块为您的方法创build返回值。 AFJSONRequestOperationasynchronous执行其工作。 someFunctionfunction将在操作仍在工作时返回。 成功和失败块是如何得到结果值,他们需要去的地方。

这里的一个select是将调用者作为parameter passing给包装方法,以便完成块可以closures数组。

 - (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) {} } 

你也可以让你的调用者创build并传递一个Block来成功运行。 然后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) {} } 

正如其他人所说,在处理asynchronous调用时你不能这么做。 而不是返回预期的数组,您可以传递一个完成块作为参数

 typedef 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); } } 

然后你在那里调用一些函数。 这段代码也会为你做适当的error handling。

 [yourClassInstance someFunctionWithBlock:^(NSArray* array, NSError *error) { if (error) { NSLog(%@"Oops error: %@",error.localizedDescription); } else { //do what you want with the returned array here. } }]; 

我面对这样的问题,并通过下面的这个方法来解决它。 我看到上面的答案使用块。 但是这个解决scheme当时比较适合。 该方法的逻辑很简单。 您需要将对象及其方法作为参数发送,并在请求完成后调用该方法。 希望它有帮助。

 +(void)request:(NSString *)link parameters:(NSDictionary *)params forInstance:(id)instance returns:(SEL)returnValue { AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager GET:link parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { [instance performSelector:returnValue withObject: responseObject]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { [instance performSelector:returnValue withObject:nil]; //NSLog(@"Error: %@", error); }]; }