核心数据多对多关系导致获取的结果控制器崩溃

Posted

技术标签:

【中文标题】核心数据多对多关系导致获取的结果控制器崩溃【英文标题】:Core Data to-many relationship causing fetched results controller to crash 【发布时间】:2015-07-27 09:04:46 【问题描述】:

我有一个问题模型对象,它与对该问题的尝试有很多关系。

我正在使用 Fetched Results Controller 列出问题。当我在表格视图中点击一个问题时,它会加载一个包含该问题的详细视图。

提交答案后,我想将另一次尝试附加到问题对象上,这样我就有了尝试的历史记录。

这就是事情变得奇怪的地方。提交答案时屏幕上没有表格视图,但在我定义尝试和问题之间的关系(即attempt.question = currentQuestion)时,它会导致底层获取结果控制器崩溃。

似乎调用了 frc 委托方法 controller:didChangeContent:atIndexPath:forChangeType:newIndexPath: 两次,第一次用于更新(这是有道理的,因为问题对象已更改),但第二次用于插入(这没有意义,因为没有问题对象被删除或插入)。

获取结果控制器的获取请求仅查询问题对象,并且对该问题的尝试不感兴趣。

无论尝试是有序的还是无序的多对多关系,都会发生这种情况,并且只在设备上而不是在模拟器上。

如果能帮助我弄清楚为什么会发生这种情况,我将不胜感激。

【问题讨论】:

哪个 Xcode 版本,哪个 ios、模拟器或设备?也许和这个问题相同:***.com/questions/31383760/… ? Xcode 7. 是的,这是同样的错误(除了在我的情况下它调用.Insert,而不是.Move),但修复工作。非常感谢。 但对于.Insert 只有newIndexPath 有效。同样的检查if indexPath != newIndexPath真的能解决问题吗?也许您可以使用事件日志以及“旧”和“新”索引路径来更新您的问题。 【参考方案1】:

感谢 Martin R,他将我指向this solution。

出于某种原因,即使在我的情况下它是 .Insert 事件而不是链接问题中的 .Move 事件,对委托的调用仍然使用与 atIndexPath 相同的索引路径填充 newIndexPath 参数参数。

在允许表格视图插入行之前对这两个参数执行不等式检查可以解决问题,因为这两个对象是相同的:

(lldb) po indexPath
▿ Optional(<NSIndexPath: 0xc000000000008016> length = 2, path = 0 - 1)

(lldb) po newIndexPath
▿ Optional(<NSIndexPath: 0xc000000000008016> length = 2, path = 0 - 1)

【讨论】:

以上是关于核心数据多对多关系导致获取的结果控制器崩溃的主要内容,如果未能解决你的问题,请参考以下文章

从与 Doctrine2 的多对多关系中获取数据

从多对多关系中获取核心数据

如何在laravel中获取多对多关系项

核心数据 VS 验证错误对象,导致崩溃

核心数据:获取特定对象的多对多关系中的所有实体?

如何在 IOS Swift 中获取核心数据中的多对多关系?