0

このコードは、dispatch_sync の呼び出しをブロックしています。キューをディスパッチするのは初めてです。これがブロックされる理由は何ですか?

NSLog(@"%@",dispatch_get_current_queue());
NSLog(@"%@",dispatch_get_main_queue());

if (dispatch_get_current_queue() == dispatch_get_main_queue())
{
    block();
}
else
    dispatch_sync(dispatch_get_main_queue(),block);

ログはこれらのキューを出力します

OS_dispatch_queue_root: com.apple.root.low-priority[0x345bbc0]

OS_dispatch_queue: com.apple.main-thread[0x345b900]>

4

1 に答える 1

3

現在のキューをメイン キューと比較することは、メイン スレッドで実行されているかどうかを確認する有効な方法ではありません。

GCD ドキュメントから - http://developer.apple.com/library/mac/#DOCUMENTATION/Darwin/Reference/ManPages/man3/dispatch_get_main_queue.3.html

メインスレッドで呼び出された場合、dispatch_get_main_queue() の結果は、dispatch_get_current_queue() の結果と等しくない場合があります。2 つを比較することは、コードがメイン スレッドで実行されているかどうかをテストする有効な方法ではありません。Foundation/AppKit プログラムは [NSThread isMainThread] を使用する必要があります。POSIX プログラムは、pthread_main_np(3) を使用する場合があります。

dispatch_get_current_queue() は非推奨であり、デバッグのみを目的としているため、本番コードでは使用しないでください。

このキューがメイン キューかどうかを確認する必要はありません。メイン キューで dispatch_sync するだけでそこに到達します。

于 2013-07-16T14:44:03.017 に答える