块执行之后变量返回null(Variable returning null after block

2019-08-02 15:19发布

我派遣一个队列上下载一个单独的线程(在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的属性,因此一旦在块的设置,它应该是它的外部访问。

Answer 1:

在块中的码被异步运行。 所以块之后的代码块中的代码有机会运行(或肯定至少完成)之前运行。



Answer 2:

我刚开始学习Objective-C,我可以瞎某种问题,但我想知道什么是_dispatch_asynch_对执行上面显示的代码块的影响。 文件说:

所述dispatch_async()和dispatch_sync()函数调度块的调度框架内的并发执行。

也许NSLog的调用之前代码块和变量的执行尚未初始化。

@rmaddy你也较快。



Answer 3:

好吧,我想通了这一点。 我的目标是与块返回的信息更新的tableView。

块执行被改变数组变量,但没有得到显示,变化。

诀窍是检测在吸气剂对阵列这种改变如下:

-(void) setListOfCities:(NSArray *)listOfCities
{
    if (_listOfCities!=listOfCities)
    {
        _listOfCities=listOfCities;
        [self.tableView reloadData]; //<-- reloads table after change
    }
}


文章来源: Variable returning null after block execution