我有一个类(称为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上做些什么来改变它?
答案 0 :(得分:4)
此问题的原因来自于您正在为信息实现setter -setInfo:
并调用willChangeValueForKey:
|其中didChangeValueForKey:
。
我见过许多情况,认为需要执行will|didChange...
调用才能触发KVO通知。只有在未明确调用setter时才会出现这种情况。当您调用setter时,KVO机制负责触发通知。
大多数时候在setter中留下这些调用是无害的,只会引起额外的通知,但是在这种情况下,它会在更新keypath时产生问题 - 而不是密钥。
简而言之,如果您实现了一个setter,请不要在其中调用will|didChangeValueForKey:
。
答案 1 :(得分:-1)
我认为选项不能为0。
它是一个旧的API,在苹果公司努力学习API设计之前,你必须给它一些东西。