0

我是 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 并接受一个块作为参数来调用。不得不改变所有这些方法似乎过分了。我在概念上错过了什么吗?

4

1 回答 1

7

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

基本上,这意味着您不能-foo基于该块返回任何内容,因为该块尚未触发。您需要重新设计您的-foo方法以使其本身是异步的。

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

于 2013-03-20T19:05:32.840 回答