Как синхронизируются задачи при асинхронной отправке в разные очереди отправки? (пример Shutterbug)

В примере кода Shutterbug, представленном в лекции 10, осенью 2011 г., фотографии загружаются, а затем обновляются в контроллере табличного представления с помощью следующего кода:

    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 до тех пор, пока не завершится загрузка фотографии. Если бы этого не произошло, self.photos был бы нулевым, если задача main_queue была запущена до завершения загрузки фотографии.


person ChipK    schedule 11.01.2013    source источник


Ответы (1)


Хм. Мой первоначальный ответ здесь был совершенно неверным, я, видимо, неправильно прочитал фрагмент кода. Причина, по которой код обновления представления не запускается до тех пор, пока эти фотографии не будут получены, заключается в том, что -recentGeoreferencedPhotos не является асинхронным. dispatch_async не запускает асинхронность до тех пор, пока программа не достигнет его, поэтому -recentGeoreferencedPhotos уже вернулся к этому моменту.

person Catfish_Man    schedule 11.01.2013
comment
О... так это содержащий программный блок, который обеспечивает последовательное выполнение операторов внутри блока, следовательно, -recentGeoreferencedPhotos завершается до отправки кода пользовательского интерфейса. Понятно! Спасибо. - person ChipK; 11.01.2013