46

コアデータと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_get_global_queue外部のdispatch_asyncとdispatch_get_main_queue内部のdispatch_asyncに使用するのか誰かに説明してもらえますか。

4

5 に答える 5

91

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

ただし、バックグラウンドキューでユーザーインターフェイスの更新を実行することは許可されていないことに注意してください。したがって、dispatch_asyncto dispatch_get_main_queue(つまりDispatchQueue.main.async { ... }、Swift)を使用すると、メインキューが利用可能。

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

詳細については、並行性プログラミングガイドを参照してください。

于 2012-10-02T15:28:51.387 に答える
15

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

したがってdispatch_get_main_queue、メインスレッドに関連付けられたキューを取得します。これを行わないと、UIが別のスレッドで更新されたときに奇妙なことが起こります。通常、UIがフリーズする長い一時停止が表示されます。

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

于 2012-10-02T15:25:59.360 に答える
9

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

于 2012-10-02T15:19:10.533 に答える
2
**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);
    }
});
于 2017-01-05T14:22:29.017 に答える
0

簡単に言うdispatch_get_global_queueと、バックグラウンドタスクを実行するために使用されます。ただし、バックグラウンドでタスクを実行しているときに、に関連するタスクを実行する必要がある場合は、で実行するuser interface必要があります。dispatch_get_main_queue()

于 2020-12-27T08:52:43.657 に答える