2

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

但是每次我更改控制器处理的对象时都会崩溃,应用程序会因非常奇怪的错误而崩溃。

当删除部分中的最后一个对象以及更改使对象爱到另一个部分时,会出现此问题。

我一直在使用 Dave Mark 和 Jeff LaMarche 的“More iPhone 3 Development Tackling iPhone SDK 3”中的示例代码。我还包含了链接文本的一些更改

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

*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:节数无效。更新后表视图中包含的节数(1)必须等于更新前表视图中包含的节数(2),加上或减去插入或删除的节数(2插入,0已删除)。2010-03-14 16:23:29.758 Instaproofs[5879:207] Stack: ( 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 上正常工作。

如果有人帮我弄清楚我做错了什么,那将是救命稻草。

4

2 回答 2

5

从您的错误消息中可以看出,当您应该删除节时,您正在将节插入表中。即使您告诉 tableView 期望总共有四个部分,您的 tableView 数据源也只在更新后提供一个部分。

我不认为这是 NSFetchedResultsController 有问题的情况,而是在简单的用例之外实现起来很棘手。由于您的控制器:didChangeObject:atIndexPath:forChangeType:newIndexPath 委托方法,您的崩溃几乎肯定会发生。成功实现此方法的关键(至少在我的经验中)是要记住 changeTypes 是对象和 indexPath 驱动的。这使得“更新”和“移动”在概念上变得棘手。

考虑更改托管对象以使其在新的 sectionNameKeyPath 下排序的情况。从概念上讲,我们认为该对象已“移动”到新部分,因为 fetchedResultsController 现在将其排序到 tableView 中的新标题下。但是,如果对象的 indexPath 没有改变,那么 fetchedResultsController 会认为这是“更新”而不是“移动”。

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

没有试图用太多的语言来解释它,LaMarche 的修复试图以一种通用的方式解决这个问题,以适应尽可能多的用例。通过尝试理解与您的用例相关的问题,您可能能够显着降低 LaMarche 使用的代码的复杂性。特别关注委托方法的“更新”和“移动”部分,因为它们最有可能是造成问题的罪魁祸首。

于 2010-03-26T20:25:43.553 回答
0

看看这个资源:

http://iphonedevelopment.blogspot.com/2009/11/i-know-youre-tired-of-hearing-about.html

极大地帮助了我。

于 2010-06-16T14:31:07.723 回答