2012-03-07 3 views
48

いくつかの他の方法の中で、GCDにキューを取得するために、これらの2つの方法があります。私は完全に間違っていないよ場合GCDの「グローバルキュー」と「メインキュー」の違いは何ですか?

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

dispatch_get_main_queue(); 

は、「メインキューは、」メインスレッド上で実行されると、コールバック「のために良いです"UI作業を実行するブロック。

これは、「グローバルキュー」がバックグラウンドスレッドで実行されることを意味しますか?

答えて

66

メインキューは実際にあなたが言うようにメインスレッドで実行されます。 dispatch_queue_create()、とすぐにスレッドが利用可能になると、世界的な同時キュー スケジュールブロックに割り当てられたメインキューまたはキューとは異なり

グローバルキューは同時キューとdispatch_get_global_queueのメインページからです(「非FIFO」の完了注文)。世界同時 キューは、3つの優先バンドを表す:

 • DISPATCH_QUEUE_PRIORITY_HIGH 
     • DISPATCH_QUEUE_PRIORITY_DEFAULT 
     • DISPATCH_QUEUE_PRIORITY_LOW 

ブロックは、優先度の高いグローバルキューに提出 デフォルトまたは低優先度グローバルキューに提出されたものの前に呼び出されます。低優先度グローバルキューにサブミットされたブロックは、デフォルトキューまたは高優先度キューに未処理のブロックがない場合にのみ、 が呼び出されます。

したがって、キューは、バックグラウンドスレッドが利用可能になると同時に実行されます。それらは「非FIFO」なので、注文は保証されません。

+0

グローバルキューは並行キューであり、(dispatch_queue_createなどで)独自の並行キューを作成することはできません。 –

7

はい。あなたはそれをテストするには、デバイス上で、このようなコードを実行することができます。

dispatch_async(
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      NSLog(@"Block 1a"); 
      NSAssert(![NSThread isMainThread], @"Wrong thread!"); 
      NSLog(@"Block 1b"); 
     }); 
dispatch_async(
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      dispatch_async(dispatch_get_main_queue(), ^{ 
        NSLog(@"Block 2a"); 
        NSAssert([NSThread isMainThread], @"Wrong thread!"); 
        NSLog(@"Block 2b"); 
       }); 
     }); 
21

5つのキュー(4背景、1メイン)のすべてがあまりにも(-[NSThread threadPriority])別のスレッドの優先順位を持っている:

      -main- : 0.758065 
     DISPATCH_QUEUE_PRIORITY_HIGH : 0.532258 
    DISPATCH_QUEUE_PRIORITY_DEFAULT : 0.500000 
     DISPATCH_QUEUE_PRIORITY_LOW : 0.467742 
DISPATCH_QUEUE_PRIORITY_BACKGROUND : 0.000000 

(上のテストiPodの第4世代とMacBook Proの)

1

グローバルディスパッチキュー上のシミュレータ:同時キューの元で

  1. タスク

    1. アプリケーションのメイン でタスクを実行可能なシリアルキュー:同時にecutes [バックグラウンドスレッド]
    2. タスクはまだ彼らがメインディスパッチキューキュー

    に追加された順序で起動されています糸。

  2. バックグラウンド処理が完了し、ユーザーインターフェイスが に更新される必要がある場合、通常はバックグラウンドキューから呼び出されます。
関連する問題