首页 文章

使用NSFetchedResultsController时,CoreData如何与UITableView相关?

提问于
浏览
0

你当然有这个错误:

CoreData:错误:严重的应用程序错误 . 在调用-controllerDidChangeContent:期间,从NSFetchedResultsController的委托中捕获到异常 . 无效更新:无效的节数 . 更新后的表视图中包含的节数(8)必须等于更新前的表视图中包含的节数(8),加上或减去插入或删除的节数(插入1个,0删除) . 用户信息(null)

这条消息对我来说没有意义,因为CoreData与NSFetchedResultsController有关但是CoreData与表视图无关 . (如果我错了,请纠正我)我理解它的方式,tableview和NSFetchedResultsController之间的唯一链接是在NSFetchedResultsController的委托中,当我们使用 controller(didChangeObject:)controller(didChangeSection:)

如果使用UITableView,iOS框架如何知道tableView的部分数量's not even mandatory (It'推荐但不是强制性的......它应该只能检查NSFetchedResultsController结果fetchedObjects结果数组而不是tableview .

1 回答

  • 0

    通常,控制器的委托以下列方式实现(取自Apple的核心数据编程指南):

    - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
    {
        [[self tableView] endUpdates];
    }
    

    tableView 收到 endUpdates 消息时,它会在我们的上下文中做两件重要事情:

    • 计算自 beginUpdates 以来插入和/或删除了多少部分(使用 insertSections:withRowAnimation 方法)

    • 检查这些更改是否反映在数据源中 . 在您的情况下,它们不是:通过在表视图上调用 insertSections:withRowAnimation 插入了1个部分,但是当询问部分计数时,数据源仍然返回8 . 这基本上就是错误信息所说的内容 .

    因此表视图指出它的状态是不一致的,它会抛出异常 .

    我们仍然在 controllerDidChangeContent 委托方法中 . 让我们再看看错误消息:

    在调用-controllerDidChangeContent期间从NSFetchedResultsController的委托中捕获到异常

    所以 NSFetchedResultsControllertry 块内的委托上调用 controllerDidChangeContent 并捕获异常 . 然后它重新抛出它 .

    长话短说: NSFetchedResultsController 对表视图一无所知 - 它刚刚捕获了 endUpdatesendUpdates 方法中抛出的异常 .

相关问题