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