2011 年秋の講義 10 で紹介された Shutterbug のサンプル コードでは、写真がダウンロードされ、次のコードを使用してテーブル ビュー コントローラーに更新されます。
dispatch_queue_t downloadQueue = dispatch_queue_create("flickr downloader", NULL);
dispatch_async(downloadQueue, ^{
NSArray *photos = [FlickrFetcher recentGeoreferencedPhotos];
dispatch_async(dispatch_get_main_queue(), ^{
self.navigationItem.rightBarButtonItem = sender;
self.photos = photos;
});
});
dispatch_release(downloadQueue);
クラスで説明したように、写真のフェッチ アクティビティは flickr ダウンローダー キューで非同期にディスパッチされ、テーブル ビューの更新コード (UIKit 機能) は main_queue で非同期にディスパッチされます。
私が理解していないのは、写真のフェッチ アクティビティが完了するまで main_queue のテーブル ビュー更新コードが実行されないようにするメカニズムです。コード ブロックでは、キューは連続してディスパッチされますが、システムがどのように認識しているかわかりません。写真のダウンロードが完了するまで main_queue でタスクを実行しないようにします。これが発生しない場合、写真のダウンロードが完了する前に main_queue タスクが実行された場合、self.photos は nil になります。