【发布时间】:2016-10-30 21:09:12
【问题描述】:
您将如何执行 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");
}
}
}
}
但我正在寻找更优雅和可重用的解决方案,更易于编写和维护(没有很多缩进块)。
非常感谢, 丹
【问题讨论】:
-
如果问题是“我怎么知道他们什么时候完成”,你通常会使用
dispatch_group。所以,在每次异步调用之前进入组,在异步调用的完成处理程序中退出组,然后配置一个dispatch_group_notify在所有异步调用完成时执行。例如,stackoverflow.com/a/29716069/1271826 或 stackoverflow.com/a/34532865/1271826。
标签: ios objective-c asynchronous objective-c-blocks