iOS - 连接基于异步块的操作

时间:2016-10-30 21:09:13

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

您将如何执行N个异步操作,例如网络调用,使用完成块操作以及没有代理/通知?

给出N个这样的方法:

- (void)methodNWithCompletion:(void (^)(Result *))completion {
    Operation *operation = [Operation new];

    // ...
    // Asynchronous operation performed here
    // ...

    return;
}

一个简单的解决方案是在前一个操作的完成块中调用每个操作:

[self method1WithCompletion:^(Result *result) {
    // ...
    [self method2WithCompletion:^(Result *result) {
        // ...
        [self method3WithCompletion:^(Result *result) {
            // ...
            [self method4WithCompletion:^(Result *result) {
                NSLog(@"All done");
            }
        }
    }
}

但我正在寻找一种更优雅,可重复使用的解决方案,更易于编写和维护(没有多少缩进块)。

非常感谢, DAN

1 个答案:

答案 0 :(得分:3)

这一切都取决于你想做什么。您可以使用许多功能强大的复杂工具。您可以使用以下内容:

  • 串行队列(如果您希望按顺序运行完成块)

  • 并发队列(如果您不关心完成块是同时执行还是以何种顺序执行)

  • 派遣小组(如果只有在所有完成块完成后才想要做的事情)

  • Operation and OperationQueue(如果您想建立必须进行网络操作的依赖关系顺序 - 请参阅关于此主题的精彩WWDC 2015视频)