在 Lecture 10, Fall 2011 中介绍的 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。