web-dev-qa-db-ja.com

GCDの「グローバルキュー」と「メインキュー」の違いは何ですか?

他のいくつかの方法の中で、GCDでキューを取得するこれらの2つの方法があります。

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_get_main_queue();

私が完全に間違っていなければ、「メインキュー」はメインスレッドで実行されており、UI作業を実行する「コールバック」ブロックに適しています。

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

55
Proud Member

あなたが言うように、メインキューは確かにメインスレッドで実行されます。

グローバルキューは並行キューであり、dispatch_get_global_queueのメインページからのものです。

メインキューまたはdispatch_queue_create()で割り当てられたキューとは異なり、グローバルコンカレントキューは、スレッドが利用可能になるとすぐにブロックをスケジュールします(「非FIFO」完了順序)。グローバルな並行キューは、3つの優先順位バンドを表します。

       •   DISPATCH_QUEUE_PRIORITY_HIGH
       •   DISPATCH_QUEUE_PRIORITY_DEFAULT
       •   DISPATCH_QUEUE_PRIORITY_LOW

高優先度グローバルキューに送信されたブロックは、デフォルトまたは低優先度グローバルキューに送信されたブロックの前に呼び出されます。低優先度のグローバルキューに送信されたブロックは、デフォルトまたは高優先度のキューで保留中のブロックがない場合にのみ呼び出されます。

そのため、それらは利用可能になるとバックグラウンドスレッドで実行されるキューです。それらは「非FIFO」であるため、順序は保証されません。

76
mattjgalloway

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 4th genおよびMacBook Proのシミュレータでテスト済み)

26
jjrscott

はい。デバイスで次のようなコードを実行してテストできます。

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");
                });
        });

GCDは、3つの主なタイプのキューを提供します。

  1. _Main queue_:メインスレッドで実行され、シリアルキューです。これは、並行キューのタスクで作業を完了した後にUIを更新する一般的な選択肢です。

  2. _Global queues_:システム全体で共有される並行キュー。これは、バックグラウンドで非UI作業を実行する一般的な選択肢です。 highdefaultlow、およびbackgroundのように、優先順位が異なる4つのキューがあります。バックグラウンドの優先度キューは最も低い優先度を持ち、I/Oアクティビティで調整されて、システムへの悪影響を最小限に抑えます。グローバルな並行キューを設定するとき、優先度を直接指定しないでください。代わりに、Quality of Service (QoS)クラスプロパティを指定します。

    a。 _User-interactive_-これは、ニースのユーザーエクスペリエンスを提供するためにすぐに実行する必要があるタスクを表します。これはメインスレッドで実行である必要があります。

    b。 _User-initiated_-Iから開始であり、非同期に実行できるタスクを表します。ユーザーが即時の結果を待っているとき、およびユーザーとの対話を継続するために必要なタスクに使用する必要があります。

    c。 Utility-これは、通常はユーザーに表示される進行状況インジケーターを使用した、長時間実行されるタスクを表します。 計算I/Oネットワーク連続データフィードおよび同様のタスクに使用します。このクラスは、エネルギー効率が良くなるように設計されています。

    d。 Background-これは、ユーザーが直接認識していないタスクを表します。プリフェッチ、メンテナンス、およびユーザーの操作を必要とせず、時間に依存しない他のタスクに使用します。

  3. _Custom queues_:これらのキュー内のリクエストは、実際にはグローバルキューのいずれかになります。作成できるキュー

    a。 _Serial Queue_-グローバルシリアルキューはDispatchQueue.mainのみですが、プライベートシリアルキューを作成できます。

    b。 _Concurrent Queue_-バックグラウンド作業を連続して実行して追跡する場合に適しています。

同期と非同期

続きを読む herehere

4
yoAlex5

グローバルディスパッチキュー:

  1. 並行キュー内のタスクは並行して実行されます[バックグラウンドスレッド]
  2. タスクはまだキューに追加された順序で開始されます

メインディスパッチキュー:

  1. アプリケーションのメインスレッドでタスクを実行する使用可能なシリアルキュー。
  2. 通常、バックグラウンド処理が完了し、ユーザーインターフェイスを更新する必要があるときに、バックグラウンドキューから呼び出されます。
4
Lyju I Edwinson