iOS-级联异步块操作

iOS-级联异步块操作,ios,objective-c,asynchronous,objective-c-blocks,Ios,Objective C,Asynchronous,Objective C Blocks,如何执行N个异步操作,例如网络调用、完成块操作和无委托/通知 给定N个这样的方法: - (void)methodNWithCompletion:(void (^)(Result *))completion { Operation *operation = [Operation new]; // ... // Asynchronous operation performed here // ... return; } 一个简单的解决方案是调用前一个操作

如何执行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");
            }
        }
    }
}
但我正在寻找一个更优雅、可重用、更易于编写和维护(没有很多缩进块)的解决方案

非常感谢,,
丹:这完全取决于你想做什么。您可以使用许多功能强大的复杂工具。您可以使用以下内容:

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

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

  • 调度组(如果只有在所有完成块完成后才需要执行某些操作)

  • 操作和操作队列(如果您想建立网络操作必须发生的依赖顺序,请参阅本主题的精彩WWDC 2015视频)


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

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

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

      • 调度组(如果只有在所有完成块完成后才需要执行某些操作)

      • 操作和操作队列(如果您想建立网络操作必须发生的依赖顺序,请参阅本主题的精彩WWDC 2015视频)


      如果问题是“我如何知道何时完成”,您通常会使用
      dispatch\u group
      。因此,在执行每个异步调用之前输入组,在异步调用的完成处理程序中退出组,然后配置在所有异步调用完成时执行的
      dispatch\u group\u notify
      。例如,或者,如果问题是“我如何知道他们何时完成”,您通常会使用
      dispatch\u group
      。因此,在执行每个异步调用之前输入组,在异步调用的完成处理程序中退出组,然后配置在所有异步调用完成时执行的
      dispatch\u group\u notify
      。例如,或者,我需要按照给定的顺序执行完成块,并在所有完成块结束后执行一些代码。我试图编写一个没有操作/操作队列的解决方案,以使代码非常简单。然后,阅读我在回答中所说的内容,您将使用串行队列和调度组。在我看来,操作更具表现力,可以更优雅地处理意外情况,但如果您使用的是完成块而不是委托方法,则可以不使用操作。是的,我一定会看看这种方法,谢谢@DAN-“我需要按照给定的顺序执行完成块…”-你确定吗?您是否绝对需要使用其中一个的结果才能开始下一个?您需要为要求按特定顺序执行它们付出巨大的性能代价。如果你必须这样做,那就这样吧,但这意味着更广泛的设计问题。这已经被问过很多次了,所以我不想在这个话题上发表另一个答案。我的观点是,Dan问“我有一堆带有完成处理程序的非同步方法”,我只是想确保他知道他不能只是将这些方法添加到串行队列中,然后期望它们能够工作。我会建议运营或承诺/未来。或者只做一些简单的事情,比如只在前一个请求的完成处理程序中启动一个请求。我需要按照给定的顺序执行完成块,并在所有完成块结束后执行一些代码。我试图编写一个没有操作/操作队列的解决方案,以使代码非常简单。然后,阅读我在回答中所说的内容,您将使用串行队列和调度组。在我看来,操作更具表现力,可以更优雅地处理意外情况,但如果您使用的是完成块而不是委托方法,则可以不使用操作。是的,我一定会看看这种方法,谢谢@DAN-“我需要按照给定的顺序执行完成块…”-你确定吗?您是否绝对需要使用其中一个的结果才能开始下一个?您需要为要求按特定顺序执行它们付出巨大的性能代价。如果你必须这样做,那就这样吧,但这意味着更广泛的设计问题。这已经被问过很多次了,所以我不想在这个话题上发表另一个答案。我的观点是,Dan问“我有一堆带有完成处理程序的非同步方法”,我只是想确保他知道他不能只是将这些方法添加到串行队列中,然后期望它们能够工作。我会建议运营或承诺/未来。或者只做一些简单的事情,比如只在前一个请求的完成处理程序中启动一个请求。