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];