几天后似乎找到了解决我自己问题的方法,结果发现我错过了一些东西。
重读NSKeyValueObserving Protocol ReferencekeysPathsForValuesAffectingValueForKey:
中对方法的讨论后,才明白下面这句话的意思:
当 key 的观察者注册到接收类的实例时,key-value 观察本身会自动观察同一实例的所有 key 路径,并在其中任何一个的 value 时向观察者发送 key 的更改通知关键路径变化。
简而言之,您的实例应该有一个观察者观察您的属性变化<key>
:
[myInstance addObserver:myObserver forKeyPath:attributeKey options:nil context:nil];
一旦您注册了观察者,协议就会调用keysPathsForValuesAffectingValueForKey
您的特定属性键。如果此方法返回一组非空的关键路径,KVO 将为您的属性发出更改通知,如果对这些关键路径中的任何一个进行了更改,除了通知您对属性的任何直接更改。
关系键确实会被自动调用,因为 Core Data 已经使用观察者来保持逆向关系的更新。
在您希望某个属性依赖于同一实体中的另一个属性或关系的特定情况下,您必须:
- 在 awakeFromInsert: 方法中添加观察者
addObserver:forKeyPath:options:context:
- 实施
keyPathsForValuesAffectingValueForKey:
或keyPathsForValuesAffecting<key>
- 为您的属性键路径实施
observeValueForKeyPath:ofObject:change:context
以作用于相关的更改通知,即更新您的属性值。