您将如何执行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
答案 0 :(得分:3)
这一切都取决于你想做什么。您可以使用许多功能强大的复杂工具。您可以使用以下内容:
串行队列(如果您希望按顺序运行完成块)
并发队列(如果您不关心完成块是同时执行还是以何种顺序执行)
派遣小组(如果只有在所有完成块完成后才想要做的事情)
Operation and OperationQueue(如果您想建立必须进行网络操作的依赖关系顺序 - 请参阅关于此主题的精彩WWDC 2015视频)