函数返回块内的值
我正在使用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返回值。 AFJSONRequestOperation
asynchronous执行其工作。 someFunction
function将在操作仍在工作时返回。 成功和失败块是如何得到结果值,他们需要去的地方。
这里的一个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); }]; }