2013-01-11 4 views
1

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이됩니다.

답변

0

흠. 여기에 내 원래의 대답은 완전히 틀렸어, 분명히 코드 스 니펫을 잘못 읽었습니다. 사진을 가져올 때까지보기 업데이트 코드가 실행되지 않는 이유는 -recentGeoreferencedPhotos가 비동기 적이 지 않기 때문입니다. dispatch_async는 프로그램이 도달 할 때까지 비동기로 시작하지 않으므로 -recentGeoreferencedPhotos가 이미 해당 지점에서 반환되었습니다.

+0

오 ... 그래서 블록 내 명령문의 순차적 실행을 보장하는 프로그램 블록을 포함하므로 -recentGeoreferencedPhotos는 UI 코드가 전달되기 전에 완료됩니다. 알았다! 감사. – ChipK