GCD 和积木非常方便。但是当我爱上它时,我发现发生了不好的事情。看看下面的这些代码:
[self functionA:^(BOOL success) {
if (success) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
[self functionB:^(NSError *error) {
if (error != nil) {
dispatch_async(dispatch_get_main_queue(), ^(void) {
[self functionC:^(id result) {
if (result) {
[self functionD:^(BOOL success) {
if (success) {
[self DoSomething];
}
}];
}
}];
});
}
}];
});
}
}];
疯狂的?是的。我遇到了这个麻烦。
有人有避免这样的嵌套块的经验吗?
编辑:
多谢你们。确切地说,我们有更优雅的方法来做到这一点。如:
- 预先声明块
- 使子块成为独立的功能
但我期望的是一个通用的解决方案。也许是这样的:(下面的伪代码)
functionA.flat.success = [self functionB];
functionB.flat.isntnil = [self functionC];
functionB.flat.error = {};
functionC.flat.isntnil = [self functionD];
[flat call:functionA];