0
__block int x = 5;
dispatch_queue_t abe = dispatch_queue_create([[NSString stringWithFormat:@"abe'sQueue.%@", self] UTF8String], NULL);
dispatch_sync(abe, ^{
    NSLog(@"%@", [self returnSomething]);
    dispatch_async(dispatch_get_main_queue(), ^{
        x = 20;
    });
});

NSLog(@"%d", x);

メインスレッドへのネストされたコールバックが値を非同期的に変更しても、上記の結果は常に 'x' のログに記録された値である 5 になります。どこが間違っているかについてのアイデアはありますか?

4

1 に答える 1

2

メイン キューに非同期でディスパッチしています。そのブロックはキューに入れられ、dispatch_async() はすぐに戻ります。コードの残りの部分がメイン スレッドで実行されていると仮定すると、非同期的にエンキューされたブロックは、メイン イベント ループを次に通過するまで実行されません。これは、上記のすべてのコードが実行されるまで発生しません。

そのようにスカラー変数を設定する場合、メイン スレッドに dispatch_async() を実行する理由はありません。変数を直接設定するだけです(メインスレッドがdispatch_sync()でブロックされているため)。

于 2013-01-04T17:06:48.717 に答える