我有一个NSManagedObject
,其中有NSOrderedSet
对多关系,名为subpointConnections_
。我正在使用以下命令对此设置进行更改:
addObserver(self, forKeyPath: #keyPath(subpointConnections_), options: [], context: &subpointsOC)
在NSManagedObject
上的惰性属性的初始化中只能调用一次。
将任何新关系添加到子项NSManagedObjectContext
中,然后保存到我的主要上下文中。
[设置关系时,我使用以下代码,仅从'一个'设置关系的'很多':
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/
在调试中运行,然后从应用程序主菜单中多次选择“添加儿童”。观察调试输出,该输出显示对主NSManagedObjectContext的额外错误观察。
我联系了Apple支持,并已按照建议的错误提交了此问题,因为给定的通知不是原子的。
我不得不采用其他方法。现在,当发布NSManagedObjectContextDidSave通知时,我将更新NSManageObject。