我正在调度一个队列,在一个单独的线程上(在viewWillAppear中)下载一些flickr照片。当我在块中记录数组的内容时,它会完美地显示所有内容:
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
});
但是当我尝试记录在块外部的块内设置的数组时,它返回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属性,因此一旦在块中设置它,它应该可以在它之外访问。
答案 0 :(得分:3)
块中的代码是异步运行的。所以块之后的代码在块中的代码有机会运行之前运行(或者至少完成)。
答案 1 :(得分:0)
我刚刚开始学习Objective-c,我可能对某些问题视而不见但我想知道_dispatch_asynch_对上面执行的代码块有什么影响。 Docs说
dispatch_async()和dispatch_sync()函数为调度框架内的并发执行调度块。
在执行代码块之前可能会调用NSLog,而变量尚未初始化。
@rmaddy你更快。
答案 2 :(得分:0)
好的,我想出来了。我的目标是使用块返回的信息更新tableView。
块执行正在更改数组变量,但未显示该更改。
诀窍是在数组的getter中检测此更改,如下所示:
-(void) setListOfCities:(NSArray *)listOfCities
{
if (_listOfCities!=listOfCities)
{
_listOfCities=listOfCities;
[self.tableView reloadData]; //<-- reloads table after change
}
}