他のいくつかの方法の中で、GCD
でキューを取得するこれらの2つの方法があります。
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_get_main_queue();
私が完全に間違っていなければ、「メインキュー」はメインスレッドで実行されており、UI作業を実行する「コールバック」ブロックに適しています。
これは、「グローバルキュー」がバックグラウンドスレッドで実行されることを意味しますか?
あなたが言うように、メインキューは確かにメインスレッドで実行されます。
グローバルキューは並行キューであり、dispatch_get_global_queueのメインページからのものです。
メインキューまたはdispatch_queue_create()で割り当てられたキューとは異なり、グローバルコンカレントキューは、スレッドが利用可能になるとすぐにブロックをスケジュールします(「非FIFO」完了順序)。グローバルな並行キューは、3つの優先順位バンドを表します。
• DISPATCH_QUEUE_PRIORITY_HIGH • DISPATCH_QUEUE_PRIORITY_DEFAULT • DISPATCH_QUEUE_PRIORITY_LOW
高優先度グローバルキューに送信されたブロックは、デフォルトまたは低優先度グローバルキューに送信されたブロックの前に呼び出されます。低優先度のグローバルキューに送信されたブロックは、デフォルトまたは高優先度のキューで保留中のブロックがない場合にのみ呼び出されます。
そのため、それらは利用可能になるとバックグラウンドスレッドで実行されるキューです。それらは「非FIFO」であるため、順序は保証されません。
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のシミュレータでテスト済み)
はい。デバイスで次のようなコードを実行してテストできます。
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つの主なタイプのキューを提供します。
_Main queue
_:メインスレッドで実行され、シリアルキューです。これは、並行キューのタスクで作業を完了した後にUIを更新する一般的な選択肢です。
_Global queues
_:システム全体で共有される並行キュー。これは、バックグラウンドで非UI作業を実行する一般的な選択肢です。 high
、default
、low
、およびbackground
のように、優先順位が異なる4つのキューがあります。バックグラウンドの優先度キューは最も低い優先度を持ち、I/Oアクティビティで調整されて、システムへの悪影響を最小限に抑えます。グローバルな並行キューを設定するとき、優先度を直接指定しないでください。代わりに、Quality of Service (QoS)
クラスプロパティを指定します。
a。 _User-interactive
_-これは、ニースのユーザーエクスペリエンスを提供するためにすぐに実行する必要があるタスクを表します。これはメインスレッドで実行である必要があります。
b。 _User-initiated
_-Iから開始であり、非同期に実行できるタスクを表します。ユーザーが即時の結果を待っているとき、およびユーザーとの対話を継続するために必要なタスクに使用する必要があります。
c。 Utility
-これは、通常はユーザーに表示される進行状況インジケーターを使用した、長時間実行されるタスクを表します。 計算、I/O、ネットワーク、連続データフィードおよび同様のタスクに使用します。このクラスは、エネルギー効率が良くなるように設計されています。
d。 Background
-これは、ユーザーが直接認識していないタスクを表します。プリフェッチ、メンテナンス、およびユーザーの操作を必要とせず、時間に依存しない他のタスクに使用します。
_Custom queues
_:これらのキュー内のリクエストは、実際にはグローバルキューのいずれかになります。作成できるキュー
a。 _Serial Queue
_-グローバルシリアルキューはDispatchQueue.mainのみですが、プライベートシリアルキューを作成できます。
b。 _Concurrent Queue
_-バックグラウンド作業を連続して実行して追跡する場合に適しています。
グローバルディスパッチキュー:
メインディスパッチキュー: