Ios 块执行后返回null的变量

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]; //

我正在调度一个队列,以便在一个单独的线程上下载一些flickr照片(在ViewWillDisplay中)。当我将数组的内容记录到块中时,它完美地显示了所有内容:

    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重载数据]//