我花了整个晚上调试一个简单的应用程序。该应用程序从网络检索一张图像(是的,是的……旨在让我的生活更轻松),并将其显示在表格视图中。我这样做是为了练习学习核心数据。在我修复它之前,错误消息显示如下:
2012-09-30 06:16:12.854 缩略图[34862:707] CoreData:错误:严重
应用程序错误。从代表处捕获到异常
调用期间的 NSFetchedResultsController
-controllerDidChangeContent:。无效更新:节数无效。之后表视图中包含的节数
更新 (1) 必须等于包含在
更新前的表视图(0),加上或减去的数量
插入或删除的部分(0 插入,0 删除)。与用户信息
(无效的)
基本上就是这么说的FRC 委托方法出了问题。一方面,节号从0变为1。另一方面,“0插入,0删除”。那么如何增加节数呢?这不应该发生..因此出现错误。
我简单地修复了这个错误adding [self.tableView reloadData]
我的FRC设置方法。我从中得到了灵感post https://stackoverflow.com/a/7844903/359248,但我还是不太明白。答案似乎太复杂并且特定于项目。有人可以解释为什么添加reloadData
可以修复bug吗?答案可能很简单,我希望如此。
我的应用程序的关键组件(如果重要的话):
- Use
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];
}
获取结果控制器仅跟踪托管对象内容的更改after第一次获取。然后使用委托方法将这些更改传播到表视图didChangeSection
, didChangeObject
etc.
但是没有自动机制将初始获取的结果发送到表视图。这就是为什么你必须打电话的原因reloadData
after performFetch
.
然而,在某些情况下,这似乎会自动起作用。UITableViewController
calls reloadData
in viewWillAppear
(如果该表是第一次加载)。因此,如果您设置 FRC 例如viewDidLoad
, reloadData
将被叫入viewWillAppear
,并且您不必手动调用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)