我是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并接受一个块作为调用的参数。必须改变所有这些方法似乎过分。我在概念上遗漏了什么吗?
答案 0 :(得分:7)
你所缺少的是这个块是(可能是 1 )异步调用的事实。它是一个完成块,因此在请求的操作完成之前不会触发,这是一个并发操作。因此,当块被触发时,您的-foo
方法已经返回到其调用者,并且可能已经一直返回到runloop并且已经开始执行其他操作。
基本上,这意味着您无法根据块返回-foo
的任何内容,因为该块尚未触发。您需要将-foo
方法重新设计为异步本身。
1 我不熟悉RKObjectRequestOperation
,但完成块只在异步上下文中有意义。