13

このコード

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
      NSLog(@"Main Thread? %d", [NSThread isMainThread]);
});

私がメインスレッドにいることを示しています。これをしても:

queue = dispatch_queue_create("nonMainQueue", NULL);

私がまだメインキューにいると報告しています。これは、私が使用しているためのようですdispatch sync

これは、コードが dispatch_sync をまったく使用しないのと同じであることを意味しますか? また、それがまったく何もしない場合、dispatch_sync のポイントは何ですか?

4

3 に答える 3

11

キューはスレッドではないため、メインの「キュー」にいるかどうかを確認するには、次のような別のコードを使用する必要があります。

if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
   NSLog(@"On Main Thread!");
}

dispatch_get_current_queueは非推奨であり、後の iOS/Mac OS バージョンで完全に削除される可能性があることに注意してください。

于 2013-02-05T20:50:19.507 に答える
5

これは文書化された動作です。最適化として、渡されたブロックはdispatch_sync、可能であれば現在のスレッドで実行されます (ほとんどの場合)。

于 2013-02-05T20:46:04.697 に答える
1

AppleのGCDガイドからの私の理解では、ディスパッチキューが別のスレッドで実行されるという保証はありません。GCDはどのスレッドを決定し、必要に応じて新しいスレッドを作成します。

ポイントの一部は、スレッドについて考える必要がないことです。

覚えておくべき唯一のことは、メインキューのUI要素を更新していることを確認することです。次に例を示します。

// on background queue
dispatch_async( dispatch_get_main_queue(), ^(void){
    someLabel.text = @"My Text";
});
于 2013-02-05T20:39:56.550 に答える