块内函数的返回值

时间:2013-07-14 18:49:30

标签: objective-c block afnetworking

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

3 个答案:

答案 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)

正如其他人所说,在处理异步调用时你不能这样做。您可以将完成块作为参数传递

,而不是返回预期的Array
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); 
        }
}

然后你称之为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>