KVO产生错误/不接收通知

时间:2012-09-12 17:05:30

标签: objective-c key-value-observing

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

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

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

name在classA上有两种变化方式:直接设置为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上做些什么来改变它?

2 个答案:

答案 0 :(得分:4)

此问题的原因来自于您正在为信息实现setter -setInfo:并调用willChangeValueForKey: |其中didChangeValueForKey:

我见过许多情况,认为需要执行will|didChange...调用才能触发KVO通知。只有在未明确调用setter时才会出现这种情况。当您调用setter时,KVO机制负责触发通知。

大多数时候在setter中留下这些调用是无害的,只会引起额外的通知,但是在这种情况下,它会在更新keypath时产生问题 - 而不是密钥。

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

答案 1 :(得分:-1)

我认为选项不能为0。

它是一个旧的API,在苹果公司努力学习API设计之前,你必须给它一些东西