块执行后返回null的变量

时间:2012-11-12 19:23:20

标签: ios xcode multithreading null objective-c-blocks

我正在调度一个队列,在一个单独的线程上(在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属性,因此一旦在块中设置它,它应该可以在它之外访问。

3 个答案:

答案 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
    }
}