iOS - 串联基于块的异步操作

iOS - Concatenating asynchronous block-based operations

你将如何执行 N 个异步操作,例如网络调用,使用完成块操作并且没有 delegates/notifications?

给定 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");
            }
        }
    }
}

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

非常感谢, 丹

这完全取决于你想做什么。许多强大的精密工具任您使用。您可以使用这样的东西:

  • 串行队列(如果你想要完成块 运行 按顺序)

  • 并发队列(如果你不关心完成块是否同时执行或以什么顺序执行)

  • 调度组(如果你想做的事情只有在所有完成块都完成之后)

  • Operation 和 OperationQueue(如果你想建立网络操作必须发生的依赖顺序 - 尤其是关于这个主题的精彩 WWDC 2015 视频)