【问题标题】:Variable returning null after block execution块执行后变量返回 null
【发布时间】:2012-11-12 19:23:19
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      @rmaddy 你更快了。

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2019-01-29
          • 1970-01-01
          • 2015-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多