保存子 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。
我有一个 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。