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 视频)
你将如何执行 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 视频)