保存子 NSManagedObjectContext 时在 NSOrderedSet 上调用额外的错误 KVO 插入

Extra Incorrect KVO Insertion Called on NSOrderedSet When Saving Child NSManagedObjectContext

我有一个 NSManagedObject 和一个名为 subpointConnections_NSOrderedSet 对多关系。我正在使用以下方法观察此集合的变化:

addObserver(self, forKeyPath: #keyPath(subpointConnections_), options: [], context: &subpointsOC)

这只能在 NSManagedObject 上的惰性 属性 初始化时调用一次。

任何新关系都添加到子 NSManagedObjectContext 中,然后保存到我的主上下文中。

当我设置关系时,我使用下面的代码,仅从 'one':

设置关系的 'many' 端
superpoint.insertIntoSubpointConnections_(self, at: index)

insertIntoSubpointConnections_ 是自动生成的访问器。

在子 NSManagedObjectContext 中,我看到一个对 observeValue(forKeyPath... 的正确调用,它在调用上述插入代码时为我提供了 subpointConnections_ 上的正确插入索引。

但是,当我保存到父对象 NSManagedObjectContext 时,我看到对同一对象的 observeValue(forKeyPath... 有两次调用。第一次调用是在 NSOrderedSet 的末尾进行插入。第二次调用是在正确的位置插入。

在每次观察调用中评估 NSOrderedSet 时,新对象确实位于所描述的位置 - 它在第一次调用时位于集合的末尾,然后移动到正确的位置第二个电话。但是,我没有接到电话说它已从结束位置删除。

我不确定我这里是不是设置有误。我的一对多关系中的许多对象都是唯一的,所以我可以编写代码来解决这个问题,但感觉不对。

关于我可能做错了什么的想法?

奇怪的是,传递给 observeValue(forKeyPath... 的第一个更改字典包含 NSIndexSet,第二个包含 NSMutableIndexSet.

编辑

我在这里的一个简单项目中复制了这个问题:https://github.com/GilesHammond/KVO-Core-Data-Extra/

运行 在调试中,select "ADD CHILD" 从应用程序主菜单多次。观察调试输出,显示对主要 NSManagedObjectContext 的额外错误观察。

我联系了 Apple 支持并按照建议将此问题作为错误提交,因为给定的通知不是原子的。

我不得不采取不同的方法。我现在在发布 NSManagedObjectContextDidSave 通知时更新我的​​ NSManageObject。