fer*_*020 0 block objective-c ios 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];
}
Run Code Online (Sandbox Code Playgroud)
但是,据我所知,一个块只能返回自己的值; 它不能导致调用它的方法返回.它是否正确?如果是这种情况,我唯一能想到的就是foo将另一个块作为参数调用,该参数在成功或操作失败时调用.这个问题是从'foo`上调调用堆栈,我将不得不改变任何返回类型的方法返回void并接受一个块作为调用的参数.必须改变所有这些方法似乎过分.我在概念上遗漏了什么吗?
你缺少的是这个块(可能是1)被异步调用的事实.它是一个完成块,因此在请求的操作完成之前不会触发,这是一个并发操作.所以当块被触发时,你的-foo方法已经返回到它的调用者,并且可能已经一直回到runloop并且已经开始做其他的事情了.
基本上,这意味着您无法-foo根据块返回任何内容,因为块尚未触发.您需要将您的-foo方法重新设计为异步本身.
1我不熟悉,RKObjectRequestOperation但完成块只在异步上下文中有意义.
| 归档时间: |
|
| 查看次数: |
945 次 |
| 最近记录: |