块执行后返回null的variables

我正在调度一个队列,在一个单独的线程(在viewWillAppear)下载一些flickr照片。 当我在块内logging数组的内容时,它完美地显示了一切:

dispatch_queue_t photoDowonload=dispatch_queue_create("photoDownload", NULL); dispatch_async(photoDowonload, ^{ NSArray *photoList=[FlickrFetcher topPlaces]; //downloads flickr data self.listOfCities=photoList; NSLog(@"inside block: %@", self.listOfCities); //shows contents }); 

但是当我尝试logging在块外部的块内设置的数组时,它将返回null。

  dispatch_queue_t photoDowonload=dispatch_queue_create("photoDownload", NULL); dispatch_async(photoDowonload, ^{ NSArray *photoList=[FlickrFetcher topPlaces]; self.listOfCities=photoList; }); NSLog(@"after block: %@", self.listOfCities); //returns null 

这里有什么问题? self.listOfCities被设置为NSArray属性,所以一旦在块中设置,它应该可以在其外部访问。

块中的代码是asynchronous运行的。 因此,块之后的代码在块中的代码有机会运行之前运行(或至less肯定完成)。

我刚刚开始学习Objective-C,对于某些问题,我可能会失明,但是我想知道_dispatch_asynch_对执行上面显示的代码块有什么影响。 Docs说

dispatch_async()和dispatch_sync()函数调度在调度框架内并发执行的块。

也许在执行代码块之前调用NSLog,并且variables尚未初始化。

@rmaddy你快了点。

好的,我明白了这一点。 我的目标是用块返回的信息更新tableView。

块的执行正在改变数组variables,但是这个变化没有被显示出来。

诀窍是在数组的getter中检测到这种变化,如下所示:

 -(void) setListOfCities:(NSArray *)listOfCities { if (_listOfCities!=listOfCities) { _listOfCities=listOfCities; [self.tableView reloadData]; //<-- reloads table after change } }