1

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

4

1 回答 1

0

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

于 2013-01-11T17:54:33.460 回答