2013-01-11 41 views
1

在講座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功能)將在class中討論的main_queue上異步分派。

我不明白的是確保main_queue上的表視圖更新代碼直到照片獲取活動完成後才執行的機制。在代碼塊中,這些隊列被串行調度,但是我沒有在照片下載完成之後,系統如何知道不在main_queue上執行任務。如果沒有發生,如果main_queue任務在照片下載完成之前運行,self.photos將爲零。

回答

0

嗯。我在這裏的原始答案是完全錯誤的,我顯然誤讀了代碼片段。視圖更新代碼在獲取照片之後才運行的原因是-recentGeoreferencedPhotos不是異步的。 dispatch_async在程序到達之前不會啓動異步,因此-recentGeoreferencedPhotos已經返回該點。

+0

哦......所以它的包含程序塊可以確保塊內語句的順序執行,因此-recentGeoreferencedPhotos在UI代碼分派之前完成。得到它了!謝謝。 – ChipK