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

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并接受一个块作为调用的参数.必须改变所有这些方法似乎过分.我在概念上遗漏了什么吗?

Lil*_*ard 7

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

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

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

  • @ ferson2020:这就是异步性的本质.有一些方法可以引入同步行为,但它们存在风险,通常是一种糟糕的设计.风险的一个例子是,如果您正在等待的操作想要在您的线程上运行代码(即,如果您在主线程上并且由于某种原因它需要从主线程反弹),它将会死锁.更不用说阻止主线程是一个坏主意开始. (2认同)