如何组合在iOS中返回值的块和方法?

时间:2013-03-20 19:01:16

标签: ios objective-c block objective-c-blocks

我是iOS新手,我正在试图弄清楚使用它们的正确方法。这是我的设置:

我有一个方法foo,它返回一个操作(RKObjectRequestOperation)是否成功。我为操作提供了一个成功块和一个失败块,因此在成功块中我希望foo返回YES,而在失败块中我希望foo返回NO

例如:

- (BOOL) foo {
    RKObjectRequestOperation *request = [[RKObjectRequestOperation alloc] initWithRequest:urlRequest responseDescriptors:responseDescriptors];

    [request setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
        NSLog(@"Success!");
        // return YES?
    } failure:^(RKObjectRequestOperation *operation , NSError *error) {
        NSLog(@"Failure!");
        // return NO?
    }];

    [request start];
}

但是,据我所知,一个块只能返回自己的值;它不能导致调用它的方法返回。它是否正确?如果是这种情况,我唯一能想到的就是让foo将另一个块作为参数调用,该参数在成功或操作失败时调用。这个问题是从'foo`上调调用堆栈,我将不得不改变任何返回类型的方法返回void并接受一个块作为调用的参数。必须改变所有这些方法似乎过分。我在概念上遗漏了什么吗?

1 个答案:

答案 0 :(得分:7)

你所缺少的是这个块是(可能是 1 )异步调用的事实。它是一个完成块,因此在请求的操作完成之前不会触发,这是一个并发操作。因此,当块被触发时,您的-foo方法已经返回到其调用者,并且可能已经一直返回到runloop并且已经开始执行其他操作。

基本上,这意味着您无法根据块返回-foo的任何内容,因为该块尚未触发。您需要将-foo方法重新设计为异步本身。

1 我不熟悉RKObjectRequestOperation,但完成块只在异步上下文中有意义。