5

我正在使用 Core Data 对同时具有属性和关系的实体进行建模。我想让其中一个属性依赖于另外两个关系。

Core Data FAQ 和其他几个示例+(NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key用于此目的。但是,这似乎只为我的所有关系属性调用,而不是为任何属性调用。此外keyPathsForValuesAffecting<key>,我的任何属性都不会被调用。

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

4

1 回答 1

8

几天后似乎找到了解决我自己问题的方法,结果发现我错过了一些东西。

重读NSKeyValueObserving Protocol ReferencekeysPathsForValuesAffectingValueForKey:中对方法的讨论后,才明白下面这句话的意思:

当 key 的观察者注册到接收类的实例时,key-value 观察本身会自动观察同一实例的所有 key 路径,并在其中任何一个的 value 时向观察者发送 key 的更改通知关键路径变化。

简而言之,您的实例应该有一个观察者观察您的属性变化<key>

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

一旦您注册了观察者,协议就会调用keysPathsForValuesAffectingValueForKey您的特定属性键。如果此方法返回一组非空的关键路径,KVO 将为您的属性发出更改通知,如果对这些关键路径中的任何一个进行了更改,除了通知您对属性的任何直接更改。

关系键确实会被自动调用,因为 Core Data 已经使用观察者来保持逆向关系的更新。

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

  1. 在 awakeFromInsert: 方法中添加观察者addObserver:forKeyPath:options:context:
  2. 实施keyPathsForValuesAffectingValueForKey:keyPathsForValuesAffecting<key>
  3. 为您的属性键路径实施observeValueForKeyPath:ofObject:change:context以作用于相关的更改通知,即更新您的属性值。
于 2013-03-27T14:04:09.907 回答