更新:当集合视图的表示对象是 NSManagedObjects 时,此线程识别 NSCollectionView 中的错误。该错误触发如下;
(a) 从 NSArrayController 中删除对象 (b) 在删除之后和 NSCollectionView 完成其动画之前的任何时间对相关的 nsmanagedobjectcontext 执行保存。
github 上的这些项目证明了这个问题。
https://github.com/artifacts/NSCollectionViewCoreDataBug https://github.com/iracooke/CoreDataCollectionViewCrashing
下面的原始问题
我有一个 NSCollectionView 设置,其内容绑定绑定到核心数据实体的 NSArrayController 的排列对象。在我的集合项目视图(NSCollectionView 视图的原型)中,我有几个控件通过我的集合视图项目的代表对象绑定到我的核心数据实体。
在大多数情况下,这可以正常工作。
当我尝试从 ArrayController 中删除实体时遇到 objc_exception。我只需调用即可删除这些实体;
[myArrayController removeObject:managedObjectToDelete];
不幸的是,当我这样做时,我经常收到“CoreData 无法完成故障”错误。负责的实体是由 NSArrayController 管理的实体之一。
抛出异常时对调用堆栈的检查表明,当 NSCollectionView 接收到它的 _endOfAnimation 方法时发生了崩溃。这反过来又启动了其他方法来解除绑定(在我看来,可能是我的实体的属性与控件)。
还有一点信息是,我正在使用的实体与我模型中的其他实体没有关系。
在我看来,好像正在发生以下问题;
- 当我从我的 NSArrayController 中删除对象时,它们又会从上下文中删除。
- 从上下文中删除后,对象变成了故障
- NSCollectionView 保留了对对象的引用(现在是故障)。它试图在动画结束时清理它们(解除绑定等)。
- 当 NSCollectionView 尝试清理与对象的绑定时,它会导致核心数据尝试在对象上触发错误(希望我的术语就在那里)。这会导致错误,因为该对象尚未保存到磁盘。
我能想到的防止这种情况的唯一方法是在删除之前将对象保留在存储中(通过保存它们)。这可行,但只能以一种骇人听闻的方式,因为我需要确保在再次保存之前完成一轮删除......并且由于在动画期间发生错误......经过一段时间的延迟......并且连续两次保存会导致同样的错误再次发生。
这是否意味着我不能使用支持核心数据的 NSArrayController 来填充 NSCollectionView?如果不是我做错了什么?有没有更好的方法来解决这个问题?