Ios 核心数据:为什么必须调用重新加载数据才能使我的应用程序工作?

Ios 核心数据:为什么必须调用重新加载数据才能使我的应用程序工作?,ios,core-data,Ios,Core Data,我整晚都在调试一个简单的应用程序。该应用程序从web上检索一张图像(是的,一张..希望让我的生活更轻松),并将其显示在表视图中。我这样做是为了学习核心数据。在修复之前,错误消息显示如下: 2012-09-30 06:16:12.854缩略图[34862:707]核心数据:错误:严重 应用程序错误。从的代理捕获到异常 调用时NSFetchedResultsController -controllerDidChangeContent:。无效更新:节数无效。之后表视图中包含的节数 更新(1)必须等于中

我整晚都在调试一个简单的应用程序。该应用程序从web上检索一张图像(是的,一张..希望让我的生活更轻松),并将其显示在表视图中。我这样做是为了学习核心数据。在修复之前,错误消息显示如下:

2012-09-30 06:16:12.854缩略图[34862:707]核心数据:错误:严重 应用程序错误。从的代理捕获到异常 调用时NSFetchedResultsController -controllerDidChangeContent:。无效更新:节数无效。之后表视图中包含的节数 更新(1)必须等于中包含的节数 更新前的表视图(0),加上或减去 插入或删除的节(0个插入,0个删除)。使用userInfo (空)

基本上是说,FRC委托方法出了问题。一方面,节号从0变为1。另一方面,“插入0,删除0”。那么,如何增加节数?这不应该发生。。因此出现了错误

我只需将
[self.tableView reloadData]
添加到我的FRC设置方法中,即可修复该错误。我从中得到了灵感,但我不太明白。答案似乎太复杂,而且项目太具体。有人能解释一下为什么添加
reloadData
可以修复这个bug吗?我希望答案很简单

我的应用程序的关键组件(如果重要):

  • 使用
    UIManagedDocument
    建立核心数据堆栈
  • 创建一个帮助器方法从Flickr API下载图像
  • 在NSManagedObject子类文件中,尝试从持久存储中获取图像。如果还没有,请将其插入主运行中心

    - (void)setupFetchedResultsController
    {
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"BigImage" inManagedObjectContext:self.document.managedObjectContext];
        [fetchRequest setEntity:entity];
    
        NSSortDescriptor *imageDescriptor = [[NSSortDescriptor alloc] initWithKey:@"image" ascending:YES];
        NSArray *sortDescriptors = [NSArray arrayWithObject: imageDescriptor];
        [fetchRequest setSortDescriptors:sortDescriptors];
    
        [fetchRequest setFetchBatchSize:20];
    
        // Create fetch results controller
        self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.document.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
    
        self.fetchedResultsController.delegate = self;
    
        NSError *error;
        if (![self.fetchedResultsController performFetch:&error])
        {
            NSLog(@"Error in performFetch: %@, %@", error, [error userInfo]);
        }
    
        // Critical!! I add this line to fix the bug!
            [self.tableView reloadData];
        }
    

获取的结果控制器只跟踪第一次获取后托管对象内容的更改。然后使用委托方法
didChangeSection
didChangeObject
等将这些更改传播到表视图

但是没有自动机制将初始获取的结果发送到表视图。这就是为什么您必须在
performFetch
之后调用
reloadData


然而,在某种情况下,这似乎是自动工作的
UITableViewController
调用
视图中的
reloadData
(如果表是第一次加载的)。因此,如果您在
viewDidLoad
中设置FRC,则
reloadData
将在
视图中调用,您不必手动调用它。

这正是我需要知道的。你帮了我大忙!谢谢大家!你救了我的命!