KVO 方法在 NSManagedObject 属性上触发两次

Posted

技术标签:

【中文标题】KVO 方法在 NSManagedObject 属性上触发两次【英文标题】:KVO method firing twice on NSManagedObject property 【发布时间】:2016-12-06 00:49:26 【问题描述】:

正如标题所说,我正在使用 KVO 观察 NSManagedObject 属性。方法override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) 触发了两次:第一次是为属性分配新值,第二次是我将上下文保存在CD 中。我在设置属性值后立即执行此操作。因此,我在代码中遇到了另一个问题,我的问题是为什么会发生这种情况,以及正确的方法是什么(设置属性,保存上下文并触发一次方法)。也许我不应该立即保存上下文?

【问题讨论】:

猜测:由于对象在您更新其值时被“弄脏”,因此在保存时,可能通过将更改保存到商店然后刷新实例上的所有属性来清除所有属性数据库中的内容。 【参考方案1】:

我相信我上面的评论(直觉)实际上是正确的。它似乎没有记录,但在所有平台上观察到 mergeChangesFromContextDidSaveNotification(即当您的 MOC 保存时)触发所有属性的刷新。 参考:KVO notifications after mergeChangesFromContextDidSaveNotification

关于如何处理该行为的建议:一般来说,kvo 代码应该是幂等且快速的,这正是因为它可以经常被调用,即在设置 keypath 时。

【讨论】:

我明白了,没错。感谢您的帮助!我会将其标记为正确答案。我已将保存移动到代码的其他部分,在该部分我已经删除了作为属性观察者的对象,因此它会触发一次!

以上是关于KVO 方法在 NSManagedObject 属性上触发两次的主要内容,如果未能解决你的问题,请参考以下文章

为啥我使用 NSManagedObject 在 self 上获得基于块的崩溃清除 KVO?

-[NSManagedObject willTurnIntoFault] 是不是禁用 KVO 通知?

Swift 中带有 Core Data 的 KVO 通知

KVO:如何告诉观察者,那个自我改变了?

如何告诉(托管)对象通知其 KVO 需要重新缓存其属性之一?

保存时检测对 NSManagedObject 的更改