В примере кода 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 была запущена до завершения загрузки фотографии.