1

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 になります。

4

1 に答える 1

0

うーん。ここでの私の最初の答えは完全に間違っていました。コードスニペットを読み間違えたようです。写真がフェッチされるまでビュー更新コードが実行されない理由は、-recentGeoreferencedPhotos が非同期ではないためです。dispatch_async は、プログラムが到達するまで非同期状態を開始しないため、-recentGeoreferencedPhotos はその時点までに既に返されています。

于 2013-01-11T17:54:33.460 に答える