performFetch之后fetchedObjects为nil,但tableView包含数据

时间:2016-11-19 15:00:32

标签: ios objective-c core-data

我有UITableView支持Core Data

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

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear: animated];

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

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

我在performFetch中致电viewDidLoad

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

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

编辑添加了更多代码

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

项目肯定在上下文中,因为表格中填充了子上下文中的项目。但是,在致电viewWillAppear时,self.fetchedResultsController.fetchedObjects仍为零。

这就是我致电performFetchviewDidLoad)的方式:

        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之前保存了上下文。

1 个答案:

答案 0 :(得分: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];
     });
    });