web-dev-qa-db-ja.com

dispatch_get_global_queue vs dispatch_get_main_queue

コアデータとdispatch_asyncの学習を開始します。データのセットから画像のURLを取得し、以下のようなコアデータのモデルに設定するコードブロックがあります

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
                NSString *urlString = [[[photoDictionary valueForKey:@"images"] objectAtIndex:0] valueForKey:@"url"];
                NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
                dispatch_async(dispatch_get_main_queue(), ^{
                    [photoModel setValue:imageData forKey:@"photoImageData"];

外側のdispatch_asyncにdispatch_get_global_queueを使用し、内側のdispatch_asyncにdispatch_get_main_queueを使用する理由を誰かに説明できますか。

41
tranvutuan

dispatch_get_global_queueは、非同期で実行されるバックグラウンドタスクをディスパッチできるバックグラウンドキューを取得します(つまり、ユーザーインターフェイスをブロックしません)。そして、複数のブロックをグローバルキューに送信することになった場合、これらのジョブは同時に動作できます。バックグラウンドで順番に実行する必要があるバックグラウンドキューに送信するコードのブロックが複数ある場合(あまり必要ありません)、独自のシリアルバックグラウンドキューを作成してそこにディスパッチできますが、同時バックグラウンド操作が受け入れられ、dispatch_get_global_queueは便利/効率的です。

ただし、バックグラウンドキューでユーザーインターフェイスの更新を実行することは許可されていないため、dispatch_asyncからdispatch_get_main_queueは、メインキューが使用可能になると、バックグラウンドキューがユーザーインターフェイスの更新をメインキューにディスパッチできるようにします。

これは非常に一般的なプログラミングパターンです。バックグラウンドで実行するものを送信し、ユーザー更新を実行する必要がある場合、更新をメインキューにディスパッチします。

詳細については、「 同時実行プログラミングガイド 」を参照してください。

84
Rob

dispatch_get_main_queueは、UI要素を操作するときにいつでも使用する必要があります。これは、UIフレームワークの一般的なモデルであるスレッドアフィニティに関係しています。スレッドアフィニティとは、そのオブジェクトが作成されたスレッドでのみオブジェクトを操作できることを意味します。 Cocoa TouchのUIクラスの場合、それがメインスレッドです。これは、重要なすべてのプラットフォーム上のUIフレームワークの典型的なイディオムです。

そう dispatch_get_main_queueは、メインスレッドに関連付けられたキューを取得します。これを行わないと、異なるスレッドでUIが更新されたときに奇妙なことが起こります。通常、UIがフリーズする場所で長時間停止します。

dispatch_get_global_queueは、アプリに関連付けられた特定の優先度レベルの古いキューを取得します。ネットワークコールに最適です。または、あなたの場合のように、Core Dataで作業します。

14
ageektrapped

グローバルキューは、メインキュー以外のキューを提供しますが、実際に独自のキューを作成する手間を省きます。メインキューで作業するコードが必要な場合は、get_main_queueを使用します(UIのすべての作業が必要な場所)

9
geraldWilliam
**dispatch_get_main_queue** :- Perform UI updates on this queue

 dispatch_async(dispatch_get_main_queue(), ^{


self.label.text=@"Hello";

    });

**dispatch_get_main_queue**:- Perform background tasks like downloading content

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    for (int i=0; i<100000;enter code here i++) {
        NSLog(@"HIGH 1 %d", i);
    }
});
2
Ankit garg