核心数据keyPathsForValuesAffectingValueForKey只调用关系,而不是

2019-07-23 07:03发布

我使用的核心数据同时具有属性和关系的实体模型。 我想就依赖于其他两个关系的属性之一。

核心数据FAQ和其他几个示例使用+(NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key用于此目的。 然而,这似乎只被用于所有我的关系性质的,而不是任何属性。 此外keyPathsForValuesAffecting<key>不会被调用任何我的属性。

这是正常的行为,还是我失去了一些东西? 如何计算基于其他属性或属性,例如一个属性。 的距离,通过设置startLocation和stopLocation?

Answer 1:

它看起来像一个发现几天后,解决我自己的问题,事实证明我失去了一些东西。

重读方法的讨论后keysPathsForValuesAffectingValueForKey:在NSKeyValueObserving协议参考 ,我意识到下面这句话的含义:

当该键观察者与接收类的实例注册,键 - 值观察本身自动观察全部为相同的实例的关键路径,并发送变更通知的键观察者时对任何那些的值关键路径的变化。

总之,你的情况应该有一个观察者观察更改的属性<key>

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

只要你有一个观察者注册,协议会要求keysPathsForValuesAffectingValueForKey您的特定属性键。 如果此方法返回的关键路径的非空集,韩国国际志愿者组织会发出变更通知你的属性,如果在更改这些关键路径的取得,除了通知您任何直接改变你的属性。

关系键确实会自动调用,因为核心数据已经在使用的观察员,以保持反向关系是最新的。

在你想有一个属性依赖于同一个实体中的另一个属性或关系在特定情况下,你必须:

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


文章来源: Core Data keyPathsForValuesAffectingValueForKey only calling relationships, not attributes