我有一个类(称为 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/