請先嚐試存根self.topPlaces
這樣的:
dispatch_queue_t downloadQueue = dispatch_queue_create("flickr topPlace", NULL);
dispatch_async(downloadQueue, ^{
NSArray *topPlaces = [FlickrFetcher topPlaces];
dispatch_async(dispatch_get_main_queue(), ^{
self.topPlaces = @[@"test", @"test2", @"test3"];
});
});
然後檢查self.topPlaces
值。如果它仍然是NULL
那麼我需要問你的財產self.topPlaces
有什麼終身限定符(例如強,弱,轉讓)?如果它是weak
那麼當然topPlaces
的值將是NULL
,因爲不會有任何強的指針指向它。如果是strong
,則當執行到達self.topPlaces = topPlaces;
時,NSArray *topPlaces = [FlickrFetcher topPlaces];
的值爲NULL
。
要考慮的另一件事是,當您執行異步操作時,主線程上的執行將繼續執行。所以,如果你正在做以下...
dispatch_queue_t downloadQueue = dispatch_queue_create("flickr topPlace", NULL);
dispatch_async(downloadQueue, ^{
NSArray *topPlaces = [FlickrFetcher topPlaces];
dispatch_async(dispatch_get_main_queue(), ^{
self.topPlaces = topPlaces;
});
});
NSLog(@"topPlaces = %@", self.topPlaces);
然後我希望self.topPlaces
永遠是NULL
當它擊中NSLog
由於它不會被設置到後[FlickrFetcher topPlaces]
已經完成並返回與執行繼續進入dispatch_async(dispatch_get_main_queue()...
。此時應該設置值。您可能需要執行以下操作,以確保您不僅設置屬性,還會在異步操作完成後執行某種更新操作以更新UI ...
dispatch_queue_t downloadQueue = dispatch_queue_create("flickr topPlace", NULL);
dispatch_async(downloadQueue, ^{
NSArray *topPlaces = [FlickrFetcher topPlaces];
dispatch_async(dispatch_get_main_queue(), ^{
[self updateUIWithTopPlaces:topPlaces];
});
});
- (void)updateUIWithTopPlaces:(NSArray*)topPlaces {
self.topPlaces = topPlaces;
// Perform your UI updates here
}
您究竟在哪裏檢查自我.topPlaces? – BergQuester
這段代碼被放到viewDidLoad中,我是'NSLog',它也在viewDidLoad上面的代碼之後。此外,如果它不是NULL,我的視圖會顯示一些內容,但目前它沒有顯示任何內容。 – Enzo
ut是異步代碼在FlickrFetcher代碼運行之前的調度之後運行的'NSLOg'ing。 – zaph