objective-c - KVO 产生错误/未收到通知

标签 objective-c key-value-observing

我有一个类(称为 classA),其中包含一个名为 info 的属性(一个模型类,包含大量信息),该类又包含一个名为 name 的属性>(字符串)。我希望另一个类 (classB) 在 classA 中的字符串 name 更改时收到 KVO 通知。

这就是我现在在 classB 上所做的事情:

[classA addObserver: self forKeyPath: @"info.name" options: 0 context: nil];

classA 上的值 name 更改有两种方式:当像 classA.info.name = ... 那样直接设置时以及当 info 设置为 classA.info = ...

name 直接更改时,KVO 可以完美工作。但是,当设置 info 属性并且 name 间接更改时,我收到此错误:

Cannot update for observer <classB> for the key path "info.name" from <classA>, most likely because the value for the key "info" has changed without an appropriate KVO notification being sent. Check the KVO-compliance of the classA class.

我应该对 classA 进行哪些更改才能使其正常工作?

最佳答案

此问题的原因在于您正在实现 info 的 setter -setInfo: 并调用 willChangeValueForKey: | didChangeValueForKey: 在里面。

我见过很多情况,其中需要实现 will|didChange... 调用才能触发 KVO 通知。仅当未显式调用 setter 时才如此。当您调用 setter 时,KVO 机制负责触发通知。

大多数时候,将这些调用留在 setter 中是无害的,只会导致额外的通知,但正如本例所示,它在更新 key 路径时确实会导致问题 - 而不是 key 。

简而言之,如果您确实实现了 setter,请不要在其中调用 will|didChangeValueForKey:

关于objective-c - KVO 产生错误/未收到通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12393128/

相关文章:

jenkins - 在 Jenkins 中使用键值对

ios - KVO 观察不适用于 Swift 泛型

arrays - 观察数组任何成员的任何属性的变化

ios - 实现有问题的 KeyValue Observation

objective-c - KVO : +keyPathsForValuesAffecting<Key> doesn't work with (subclass of) NSObjectController

iphone - 如何以编程方式将退出按钮添加到 UIView

objective-c - NSSplitView 中的 NSOpenGLView

iphone - iPhone 中录制的音频格式在 android 中也支持和播放

objective-c - 如何在 xcode 项目中启用/禁用 ARC?

ios - 拒绝视频通话后弹出视频通话?