块执行后返回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 } }