核心数据keyPathsForValuesAffectingValueForKey仅调用关系,而不是属性

时间:2013-03-25 15:40:00

标签: ios core-data key-value-observing

我正在使用Core Data来建模具有属性和关系的实体。我想使其中一个属性依赖于其他两个关系。

核心数据常见问题和其他几个示例使用+(NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key来实现此目的。但是,这似乎仅针对我的所有关系属性调用,而不是针对任何属性调用。另外,keyPathsForValuesAffecting<key>永远不会被我的任何属性调用。

这是正常行为还是我错过了什么?如何根据其他属性或属性计算一个属性,例如。距离,通过设置startLocation和stopLocation?

1 个答案:

答案 0 :(得分:8)

在几天之后看起来像是找到了我自己问题的解决方案,事实证明我错过了一些东西。

重新阅读NSKeyValueObserving Protocol Reference中方法keysPathsForValuesAffectingValueForKey:的讨论后,我意识到以下句子的含义:

  

当密钥的观察者向接收类的实例注册时,键值观察本身会自动观察同一实例的所有密钥路径,并在密钥值发送给观察者时将其发送给观察者。任何这些关键路径都会发生变化。

简而言之,您的实例应该让观察者观察您的属性<key>的更改:

[myInstance addObserver:myObserver forKeyPath:attributeKey options:nil context:nil];

只要您注册了观察员,协议就会针对您的特定属性键调用keysPathsForValuesAffectingValueForKey。如果此方法返回非空键集路径,则KVO将为您的属性发出更改通知(如果对这些键路径中的任何一个进行了更改),此外还会通知您对属性的任何直接更改。

自动调用关系键,因为Core Data已经使用观察者来保持反向关系的最新状态。

在您希望某个属性依赖于同一实体中的其他属性或关系的特定情况下,您必须:

  1. 使用addObserver:forKeyPath:options:context:
  2. 在awakeFromInsert:方法中添加观察者
  3. 实施keyPathsForValuesAffectingValueForKey:keyPathsForValuesAffecting<key>
  4. 为您的属性键路径实施observeValueForKeyPath:ofObject:change:context以对相关更改通知执行操作,即更新您的属性值。