3

関数:dispatch_syncを使用して同期ブロックを実行すると、アプリケーションから取得したキューdispatch_get_main_queue()がハングし、ブロックは実行されませんが、:から取得したキューを渡すと、dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)問題なく動作します。

dispatch_queue_t q;
q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//q = dispatch_get_main_queue();  //If uncommented the app hang

dispatch_sync(q , ^{
    NSLog(@".");
});

から取得したキューを使用するdispatch_get_main_queue()と、アプリがハングし、ブロックが実行されないのはなぜですか?

4

2 に答える 2

10

メインキューからメインキューに同期的にディスパッチすると、フリーズするはずです。コードのブロックをメインキューにディスパッチするように要求していますが、同期(dispatch_sync)であるため、ディスパッチされたキュー(メインキューも)が応答するまで、現在のキュー(メインキュー)をフリーズするように要求しています。あなたがそれに追加したもの!明らかにそれはできません。

するかdispatch_async、別のキューにディスパッチしてください!

于 2012-10-02T20:22:52.783 に答える
0

Robの回答に加えて、Grand Central Dispatchのドキュメント(プログラミングガイドリファレンス)があります。これは優れたライブラリのセットであり、並行性をほとんど痛みのないものにしましたが、絶対確実ではありません。

于 2012-10-02T20:30:21.660 に答える