NSFetchedResultsController

NSFetchedResultsController

自1个月以来,我一直在使用NSFetchedResultsController构建应用程序,并且在3.1.2 SDK上测试了该应用程序。问题是我一直在我的应用程序中到处使用NSFetchedResultsController并正在开发SDK的3.1.2版本,现在我的客户说我应该使其与3.0版本兼容,并且截止日期已经到了。

但是每次我更改由contoller处理的对象时都会崩溃,该应用程序崩溃时会产生非常奇怪的错误。

当删除一个节中的最后一个对象并且进行更改使某个对象喜欢另一个节时,就会出现问题。

我一直在使用Dave Mark和Jeff LaMarche的“更多iPhone 3开发解决iPhone SDK 3”中的示例代码。我还包括了link text的一些更改

这是应用程序崩溃时控制台的示例输出。

***由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效的更新:无效的节数。更新(1)后表视图中包含的节数必须等于更新(2)前表视图中包含的节数,加上或减去插入或删除的节数(插入2,0删除)。”
2010-03-14 16:23:29.758 Instaproofs [5879:207]堆栈:(
    807902715,
    7364425,
    807986683,
    811271572,
    815059090,
    815007323,
    211023,
    4363331,
    810589786,
    807635429,
    810579728,
    3620573,
    3620227,
    3614682,
    3609719,
    27337,
    810595174,
    807686849,
    807683624,
    839142449,
    839142646,
    814752238


如果我知道NSFetchedResultsController如此多虫,我将永远不会使用它。

所以基本上我需要我的NSFetchedResultsControllerDelegate在3.0及更高版本的SDK上正常工作。

如果有人帮助我弄清楚我在做什么错,那将是挽救生命的。

最佳答案

从错误消息中可以看出,您应该在删除表时将其插入表中。即使您已告知tableView预期总共有四个部分,您的tableView数据源在更新后仅提供了一个部分。

我不认为这不是NSFetchedResultsController遇到问题的情况,而是在简单的用例之外实现棘手的问题。您的崩溃几乎肯定是由于controller:didChangeObject:atIndexPath:forChangeType:newIndexPath委托方法导致的。成功实现此方法的关键(至少以我的经验)是要记住,changeTypes是对象和indexPath驱动的。从概念上讲,这使“更新”和“动作”变得棘手。

请考虑以下情况:更改了托管对象,使其在新的sectionNameKeyPath下排序。从概念上讲,我们认为对象已“移至”新部分,因为fetchedResultsController现在将其在tableView的新标题下进行排序。但是,如果对象的indexPath不变,则fetchedResultsController会将其视为“更新”而不是“移动”。

更糟糕的是,即使已更改的托管对象仍保留相同的indexPath,fetchedResultsController中的其他对象现在也可能具有新的indexPath,因为它们被更改所困扰。这意味着您将必须在委托方法的“更新”部分中手动处理节的插入和节删除。类似的问题将需要在您的委托方法的“移动”部分中解决。

LaMarche的修复程序没有试图用太多的语言来解释它,而是试图以一种通用的方式来解决这个问题,该方式可以容纳尽可能多的用例。通过尝试了解与您的用例有关的问题,您可以显着降低LaMarche使用的代码的复杂性。请特别关注委托方法的“更新”和“移动”部分,因为这些是最可能导致问题的元凶。

关于iphone - NSFetchedResultsController让我发疯,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2442865/

10-12 02:29