我整晚都在调试一个简单的应用程序。该应用程序从 Web 检索一张图像(是的,一张……旨在让我的生活更轻松),并将其显示在表格视图中。我这样做是为了学习核心数据。在我修复它之前,错误消息显示如下:
2012-09-30 06:16:12.854 缩略图 [34862:707] CoreData:错误:严重的应用程序错误。在调用 -controllerDidChangeContent: 期间,从 NSFetchedResultsController 的委托中捕获了一个异常。无效更新:无效的节数。更新后表视图中包含的节数(1)必须等于更新前表视图中包含的节数(0),加上或减去插入或删除的节数(0插入,0已删除)。与用户信息(空)
基本上它是说FRC 委托方法出了点问题。一方面,节号从 0 变为 1。另一方面,“0 插入,0 删除”。那么如何增加节数呢?那不应该发生..因此错误。
我通过简单地添加[self.tableView reloadData]
到我的 FRC 设置方法来修复错误。我从这篇文章中得到了灵感,但我不太明白。答案似乎太复杂且特定于项目。有人可以解释为什么添加reloadData
可以修复错误吗?答案可能很简单,我希望如此。
我的应用程序的关键组件,如果这很重要:
- 用于
UIManagedDocument
建立核心数据栈 - 创建一个辅助方法以从 Flickr API 下载图像
在 NSManagedObject 子类文件中,尝试从持久存储中获取图像。如果还没有,请将其插入 MOC。
- (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]; }