コアデータと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
を使用する理由を誰かに説明できますか。
dispatch_get_global_queue
は、非同期で実行されるバックグラウンドタスクをディスパッチできるバックグラウンドキューを取得します(つまり、ユーザーインターフェイスをブロックしません)。そして、複数のブロックをグローバルキューに送信することになった場合、これらのジョブは同時に動作できます。バックグラウンドで順番に実行する必要があるバックグラウンドキューに送信するコードのブロックが複数ある場合(あまり必要ありません)、独自のシリアルバックグラウンドキューを作成してそこにディスパッチできますが、同時バックグラウンド操作が受け入れられ、dispatch_get_global_queue
は便利/効率的です。
ただし、バックグラウンドキューでユーザーインターフェイスの更新を実行することは許可されていないため、dispatch_async
からdispatch_get_main_queue
は、メインキューが使用可能になると、バックグラウンドキューがユーザーインターフェイスの更新をメインキューにディスパッチできるようにします。
これは非常に一般的なプログラミングパターンです。バックグラウンドで実行するものを送信し、ユーザー更新を実行する必要がある場合、更新をメインキューにディスパッチします。
詳細については、「 同時実行プログラミングガイド 」を参照してください。
dispatch_get_main_queue
は、UI要素を操作するときにいつでも使用する必要があります。これは、UIフレームワークの一般的なモデルであるスレッドアフィニティに関係しています。スレッドアフィニティとは、そのオブジェクトが作成されたスレッドでのみオブジェクトを操作できることを意味します。 Cocoa TouchのUIクラスの場合、それがメインスレッドです。これは、重要なすべてのプラットフォーム上のUIフレームワークの典型的なイディオムです。
そう dispatch_get_main_queue
は、メインスレッドに関連付けられたキューを取得します。これを行わないと、異なるスレッドでUIが更新されたときに奇妙なことが起こります。通常、UIがフリーズする場所で長時間停止します。
dispatch_get_global_queue
は、アプリに関連付けられた特定の優先度レベルの古いキューを取得します。ネットワークコールに最適です。または、あなたの場合のように、Core Dataで作業します。
グローバルキューは、メインキュー以外のキューを提供しますが、実際に独自のキューを作成する手間を省きます。メインキューで作業するコードが必要な場合は、get_main_queueを使用します(UIのすべての作業が必要な場所)
**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);
}
});