2011 년 가을, 사진을 다운로드 한 후 다음 코드를 사용하여 테이블 뷰 컨트롤러에 업데이트됩니다다른 디스패치 대기열에서 비동기 적으로 디스패치 할 때 작업이 어떻게 동기화됩니까? (사진 광 예) 강의 (10)에 제시된 사진 광 예제 코드에서
이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가 0이됩니다.
오 ... 그래서 블록 내 명령문의 순차적 실행을 보장하는 프로그램 블록을 포함하므로 -recentGeoreferencedPhotos는 UI 코드가 전달되기 전에 완료됩니다. 알았다! 감사. – ChipK