performFetch后fetchedObjects为nil,但tableView有数据

Posted

技术标签:

【中文标题】performFetch后fetchedObjects为nil,但tableView有数据【英文标题】:fetchedObjects is nil after performFetch, but tableView has data 【发布时间】:2016-11-19 15:00:31 【问题描述】:

我有一个由Core Data 支持的工作UITableView

我现在正在实现一个功能,当表格为空时,我禁用rightBarButtonItem

- (void)viewWillAppear:(BOOL)animated

    [super viewWillAppear: animated];

    self.navigationItem.rightBarButtonItem.enabled = self.fetchedResultsController.fetchedObjects ? YES : NO;

但即使表格中有项目,self.fetchedResultsController.fetchedObjects 也会返回 nil,因此该按钮始终处于禁用状态。

我打电话给performFetchviewDidLoad

我在 viewDidLoad 中尝试了这段代码,但同样的情况发生了。

为什么self.fetchedResultsController.fetchedObjects 为零,即使表格已填充?

EDIT添加了更多代码

项目在显示表格之前立即生成到子上下文中。 fetchRequest 使用相同的上下文。

这些项目肯定在上下文中,因为表中填充了子上下文中的项目。但是,当调用viewWillAppear 时,self.fetchedResultsController.fetchedObjects 仍然为零。

我就是这样称呼performFetch(在viewDidLoad):

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^
 NSError *error = nil;
 if (![self.fetchedResultsController performFetch: &error])
 
      NSLog(@"Failed to perform fetch: %@", error);
 

 dispatch_async(dispatch_get_main_queue(), ^
            [self.tableView reloadData];
     );
    );

我在显示 VC 之前保存上下文。

【问题讨论】:

请添加用于获取和 nsmanagedObjectContext 配置的代码。 【参考方案1】:

您是否尝试过像这样在您的 dispatchBlock 中调用 self.fetchedResultsController.fetchedObjects

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^
 NSError *error = nil;
 if (![self.fetchedResultsController performFetch: &error])
 
      NSLog(@"Failed to perform fetch: %@", error);
 

 dispatch_async(dispatch_get_main_queue(), ^
            self.navigationItem.rightBarButtonItem.enabled = self.fetchedResultsController.fetchedObjects ? YES : NO;
            [self.tableView reloadData];
     );
    );

【讨论】:

哇,好用。 fetchedObjects 在显示表格后被删除肯定还有另一个原因。我会调查的。由于performFetch 代码在一个超类中,并且并非所有子类都有按钮,所以我需要稍微重构一下我的代码,但这应该不是问题。我现在也在检查self.fetchedResultsController.fetchedObjects.count,因为fetchedObjects 可能存在但为空。 问题是您正在异步队列中获取数据,这将需要一些时间,并且您在 viewWillAppear 中使用self.fetchedResultsController.fetchedObjects,可能当时没有获取结果 是的,我也在考虑这个问题。但是表格仍然被填充,所以延迟必须非常非常短。当我实际将按钮启用代码放在viewDidAppear 中时,它起作用了,但是首先出现了视图,然后按钮变暗了,看起来不太好。现在一切正常。 很高兴它有帮助:)

以上是关于performFetch后fetchedObjects为nil,但tableView有数据的主要内容,如果未能解决你的问题,请参考以下文章

NSFetchedResultsController `performFetch:` 结果不再排序

NSFetchedResultsController:在调用 -performFetch 之前,我是不是应该始终检查 fetchedObjects==nil?

CoreData、NSFetchedResultsController 和 performFetch:

NSFetchedResultsController“无法在-performFetch之前访问获取的对象:”调用objectAtIndexPath时崩溃:

[NSFetchedResultsController performFetch] 中的错误

如何提高 NSFetchedResultsController performFetch: 性能?