【问题标题】:How is CoreData related to UITableView when using NSFetchedResultsController?使用 NSFetchedResultsController 时 CoreData 与 UITableView 有什么关系?
【发布时间】:2016-03-14 08:17:32
【问题描述】:
你肯定遇到了这个错误:
CoreData:错误:严重的应用程序错误。捕获到异常
在调用期间从 NSFetchedResultsController 的委托
-controllerDidChangeContent:。无效更新:无效的节数。之后表格视图中包含的节数
更新 (8) 必须等于包含在
更新前的表视图(8),加减数
插入或删除的部分(1 个插入,0 个删除)。与用户信息
(空)
这条消息对我来说没有意义,因为 CoreData 与 NSFetchedResultsController 但 CoreData 与表视图无关。 (如我错了请纠正我)
我理解它的方式,tableview 和 NSFetchedResultsController 之间的唯一链接是在 NSFetchedResultsController 的 委托中,当我们使用 controller(didChangeObject:) 和 controller(didChangeSection:)
iOS 框架怎么可能知道 tableView 的节数,而它甚至不是强制性的(推荐但不是强制性的)使用 UITableView...
它应该只能检查 NSFetchedResultsController 结果 fetchedObjects 结果数组,而不是在 tableview 中。
【问题讨论】:
标签:
ios
uitableview
core-data
nsfetchedresultscontroller
【解决方案1】:
通常,控制器的委托以以下方式实现(摘自 Apple 的核心数据编程指南):
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[[self tableView] endUpdates];
}
当tableView 收到endUpdates 消息时,它会做两件在我们的上下文中很重要的事情:
计算自beginUpdates 以来插入和/或删除的节数(使用insertSections:withRowAnimation 方法)
检查这些更改是否反映在数据源中。在您的情况下,它们不是:通过在表视图上调用 insertSections:withRowAnimation 插入了 1 个部分,但是当询问部分计数时,数据源仍然返回 8。这基本上就是错误消息所说的内容。
所以表视图发现它的状态是不一致的,它会抛出异常。
我们仍然使用controllerDidChangeContent 委托方法。我们再来看看报错信息:
从委托中捕获了一个异常
NSFetchedResultsController 在调用期间
-controllerDidChangeContent
所以NSFetchedResultsController 在try 块内对其委托调用controllerDidChangeContent 并捕获异常。然后它重新抛出它。
长话短说:NSFetchedResultsController 对表格视图一无所知 - 它只是捕获了恰好在 UITableView 中的 endUpdates 方法中引发的异常。