0

ブロックを取るこのメソッドがありますが、そのブロックは常に呼び出されるとは限りません。メソッドを参照してください。

- (void)updateWithCompletion:(void (^)(void))completion {
    [MYObject myMethodWithCompletion:^(NSArray *array, NSError *error) {
        if (error) {
            NSLog(@"%s, ERROR not nil", __FUNCTION__);
            completion();
            return;
        }

        NSLog(@"%s, calling completion %d", __FUNCTION__, &completion);
        completion();
        NSLog(@"%s, finished completion", __FUNCTION__);
    }];
}

補完内にさらにいくつかの NSLogs があります。時々、このプログラム カウンターは、上記のコードの completion() への呼び出しを通り越して吹き飛ばされます。呼び出し元のコードは常にコードのリテラル ブロックを入力として渡すため、これがなぜなのかわかりません。

addressof 演算子を含む行の出力に興味がある場合、それは常に異なるものですが、決して 0 または nil ではありません。

完了が実行されない原因は何ですか?

4

2 に答える 2

1

完了は、私が予想していたものとは異なるコードブロックを指していることがわかりました。updateWithCompletionは、空のコードブロックを使用してviewWillAppearから呼び出されました。これが、NSLogステートメントが表示されなかった理由です。空のコードブロックがあることを確認すると、問題を修正する方法は明らかでした。

学んだ教訓:コードブロックがnilの場合、プログラムはクラッシュします。これは起こっていなかったので、それは私が期待していたもの以外の何かを呼んでいたことを意味しました。

これが誰かを助けることを願っています。

于 2012-12-11T00:11:18.243 に答える
0

プログラム カウンターがブロックを吹き飛ばすとはどういう意味ですか? 完了ブロックは、ほぼ常に非同期で実行されます。これは、はい、プログラム カウンターが呼び出しの直前から-myMethodWithCompletion:、呼び出し元に戻るメソッドの最後に直接ジャンプすることを意味します。そして、将来のある時点で、完了ブロックが呼び出されます。

于 2012-12-10T23:02:38.107 に答える