Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSFetchedResultsController快把我逼疯了_Iphone_Nsfetchedresultscontroller - Fatal编程技术网

Iphone NSFetchedResultsController快把我逼疯了

Iphone NSFetchedResultsController快把我逼疯了,iphone,nsfetchedresultscontroller,Iphone,Nsfetchedresultscontroller,从一个月以来,我一直在使用NSFetchedResultsController构建应用程序,并在3.1.2 SDK上测试该应用程序。问题是我一直在我的应用程序中到处使用NSFetchedResultsController,当时正在开发SDK的3.1.2版本,现在我的客户说我应该让它与3.0版本兼容,最后期限就快到了 但是每次我更改控制器处理的对象时,应用程序都会因为非常奇怪的错误而崩溃 删除节中的最后一个对象以及更改使一个对象更改为另一个节时会出现问题 我一直在使用Dave Mark和Jeff

从一个月以来,我一直在使用NSFetchedResultsController构建应用程序,并在3.1.2 SDK上测试该应用程序。问题是我一直在我的应用程序中到处使用NSFetchedResultsController,当时正在开发SDK的3.1.2版本,现在我的客户说我应该让它与3.0版本兼容,最后期限就快到了

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

删除节中的最后一个对象以及更改使一个对象更改为另一个节时会出现问题

我一直在使用Dave Mark和Jeff LaMarche开发的更多iPhone3开发中的示例代码来处理iPhoneSDK 3。我还包括了一些来自

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

***由于未捕获异常“NSInternalInconsistencyException”而终止应用程序,原因:“更新无效:节数无效。”。更新1之后的表视图中包含的节数必须等于更新2之前的表视图中包含的节数,加上或减去插入或删除的节数2 inserted,0 deleted。’ 2010-03-14 16:23:29.758 Instaproof[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有缺陷的情况,而是在简单用例之外实现是很困难的。崩溃几乎肯定是由控制器:didChangeObject:atIndexPath:forChangeType:newindexath委托方法导致的。至少在我的经验中,成功实现此方法的关键是要记住,变更类型是对象驱动的,也是由XPath驱动的。这使得更新和移动在概念上变得棘手

考虑这样一种情况:托管对象被更改,从而在新的sectionNameKeyPath下进行排序。从概念上讲,我们认为对象已经移动到了一个新的部分,因为fetchedResultsController现在将其排序到tableView中的一个新标题下。但是,如果对象的indexPath没有更改,则fetchedResultsController会将此视为更新而不是移动

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


LaMarche的修复程序没有试图用这么多的话来解释它,而是试图以一种通用的方式来解决这个问题,以适应尽可能多的用例。通过尝试理解与您的用例相关的问题,您可能能够显著降低LaMarche使用的代码的复杂性。请特别关注委托方法的更新和移动部分,因为这些是导致问题的最可能原因。

请查看此资源:


极大地帮助了我。

注意:我知道NSFetchedResultsController的3.0版本中有一个bug,在类参考文档中提到了它。错误只是一个问题,因为您没有指定sectionNameKeyPath。为了安全起见,您可能需要实现文档中提供的解决方法。上面的文章非常有用。我和原来的海报有同样的问题。我发现在-voidcontroller:NSFetchedResultsController*控制器didChangeObject:idanObject atIndexPath:NSIndexPath*indexPath forChangeType:nsFetchedResultsSchangeType newIndexPath:NSIndexPath*newIndexPath中进行任何更改后重新加载数据在大多数情况下都有效,尽管不是100%。我不知道这有多重要;但希望它能帮助任何看到这篇文章的人。