在不同的调度队列上异步调度时,如何同步任务? (Shutterbug示例)

时间:2013-01-11 17:44:15

标签: grand-central-dispatch cs193p

在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。

1 个答案:

答案 0 :(得分:0)

嗯。我在这里的原始答案是完全错误的,我显然误读了代码片段。视图更新代码在获取照片之后才运行的原因是-recentGeoreferencedPhotos不是异步的。 dispatch_async在程序到达之前不会启动异步,因此-recentGeoreferencedPhotos已经返回。