0

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

    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 属性,因此一旦在块中设置它,它应该可以在其外部访问。

4

3 回答 3

3

块中的代码是异步运行的。因此,块之后的代码在块中的代码有机会运行(或者至少肯定完成)之前运行。

于 2012-11-12T19:25:26.783 回答
0

我刚刚开始学习 Objective-c,我可能会对某些问题视而不见,但我想知道 _dispatch_asynch_ 对执行上面显示的代码块有什么影响。文档说

dispatch_async() 和 dispatch_sync() 函数调度块以在调度框架内并发执行。

可能在执行代码块之前调用了 NSLog 并且变量尚未初始化。

@rmaddy 你更快。

于 2012-11-12T19:34:33.483 回答
0

好的,我想通了。我的目标是使用块返回的信息更新 tableView。

块执行正在更改数组变量,但未显示该更改。

诀窍是检测数组的 getter 中的这种变化,如下所示:

-(void) setListOfCities:(NSArray *)listOfCities
{
    if (_listOfCities!=listOfCities)
    {
        _listOfCities=listOfCities;
        [self.tableView reloadData]; //<-- reloads table after change
    }
}
于 2012-11-12T19:38:48.250 回答