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

时间:2016-03-14 08:17:32

标签: ios uitableview core-data nsfetchedresultscontroller

你当然得到了这个错误:

  

CoreData:错误:严重的应用程序错误。抓住了一个例外   在调用期间来自NSFetchedResultsController的委托   -controllerDidChangeContent :.无效更新:无效的节数。表视图中包含的节数   update(8)必须等于包含的节数   更新前的表视图(8),加号或减号   插入或删除的部分(插入1个,删除0个)。用户信息   (空)

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

如果使用 UITableView ,当iOS框架甚至不是强制性的(建议但不是强制性的)时,它们如何知道tableView的部分数量。 .. 它应该只能检查NSFetchedResultsController结果fetchedObjects结果数组,而不是在tableview中。

1 个答案:

答案 0 :(得分:0)

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

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

tableView获得endUpdates消息时,它会在我们的上下文中执行两项重要操作:

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

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

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

    我们仍然使用controllerDidChangeContent委托方法。让我们再看一下错误消息:

      

    从代表处获取了一个例外   NSFetchedResultsController在调用期间   -controllerDidChangeContent

    因此NSFetchedResultsControllercontrollerDidChangeContent块内的代理上调用try并捕获异常。然后它重新抛出它。

    长话短说:NSFetchedResultsController对表视图一无所知 - 它只是抓住了endUpdatesUITableView方法中抛出的异常。