保存子NSManagedObjectContext时在NSOrderedSet上调用了额外的不正确的KVO插入

问题描述 投票:0回答:1

我有一个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的额外错误观察。

cocoa core-data key-value-observing
1个回答
0
投票

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

我不得不采用其他方法。现在,当发布NSManagedObjectContextDidSave通知时,我将更新NSManageObject。

© www.soinside.com 2019 - 2024. All rights reserved.