在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下载程序队列中异步调度照片获取活动,并在main_queue上异步调度表视图更新代码(UIKit功能),如课堂上所述。
我不明白的是确保在照片获取活动完成之后才会执行main_queue上的表视图更新代码的机制。在代码块中,队列被串行调度,但我不知道如何在照片下载完成之前,系统知道不在main_queue上执行任务。如果没有发生这种情况,如果在照片下载完成之前运行了main_queue任务,则self.photos将为nil。
答案 0 :(得分:0)
嗯。我在这里的原始答案是完全错误的,我显然误读了代码片段。视图更新代码在获取照片之后才运行的原因是-recentGeoreferencedPhotos不是异步的。 dispatch_async在程序到达之前不会启动异步,因此-recentGeoreferencedPhotos已经返回。