Ios 块执行后返回null的变量
我正在调度一个队列,以便在一个单独的线程上下载一些flickr照片(在ViewWillDisplay中)。当我将数组的内容记录到块中时,它完美地显示了所有内容:Ios 块执行后返回null的变量,ios,xcode,multithreading,null,objective-c-blocks,Ios,Xcode,Multithreading,Null,Objective C Blocks,我正在调度一个队列,以便在一个单独的线程上下载一些flickr照片(在ViewWillDisplay中)。当我将数组的内容记录到块中时,它完美地显示了所有内容: dispatch_queue_t photoDowonload=dispatch_queue_create("photoDownload", NULL); dispatch_async(photoDowonload, ^{ NSArray *photoList=[FlickrFetcher topPlaces]; //
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属性,因此一旦在块中设置了它,就应该可以在块外访问它 块中的代码是异步运行的。因此,块后的代码在块中的代码有机会运行(或至少肯定完成)之前运行。块中的代码是异步运行的。因此,在块中的代码有机会运行(或至少完成)之前运行块后的代码。我刚刚开始学习Objective-c,我可能对某些问题视而不见,但我想知道“调度异步”对执行上面显示的代码块有何影响。 医生说 dispatch_async()和dispatch_sync()函数用于调度调度框架内并发执行的块 可能在执行代码块之前调用了NSLog,并且变量尚未初始化
@你跑得更快 我刚刚开始学习Objective-c,我可能对某些问题视而不见,但我想知道上面所示的“调度异步”对执行代码块有什么影响。 医生说 dispatch_async()和dispatch_sync()函数用于调度调度框架内并发执行的块 可能在执行代码块之前调用了NSLog,并且变量尚未初始化
@你跑得更快 好吧,我想出来了。我的目标是用block返回的信息更新tableView 块执行正在更改数组变量,但未显示该更改 诀窍是在数组的getter中检测此更改,如下所示:
-(void) setListOfCities:(NSArray *)listOfCities
{
if (_listOfCities!=listOfCities)
{
_listOfCities=listOfCities;
[self.tableView reloadData]; //<-- reloads table after change
}
}
-(void)setListOfCities:(NSArray*)listOfCities
{
如果(_listOfCities!=listOfCities)
{
_listOfCities=listOfCities;
[self.tableView reloadData];//好的,我已经解决了这个问题。我的目标是用block返回的信息更新tableView
块执行正在更改数组变量,但未显示该更改
诀窍是在数组的getter中检测此更改,如下所示:
-(void) setListOfCities:(NSArray *)listOfCities
{
if (_listOfCities!=listOfCities)
{
_listOfCities=listOfCities;
[self.tableView reloadData]; //<-- reloads table after change
}
}
-(void)setListOfCities:(NSArray*)listOfCities
{
如果(_listOfCities!=listOfCities)
{
_listOfCities=listOfCities;
[self.tableView重载数据]//