我正在使用核心数据来建模一个具有属性和关系的实体。我想让其中一个属性依赖于另外两个关系。
核心数据常见问题解答和其他几个示例使用+(NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
以此目的。但是,这似乎只针对我的所有关系属性进行调用,而不针对任何属性进行调用。此外keyPathsForValuesAffecting<key>
从来没有人因为我的任何特质而被要求。
这是正常行为还是我错过了什么?如何根据其他属性或特性计算一个属性,例如。通过设置 startLocation 和 stopLocation 来确定距离?
看起来几天后我找到了自己问题的解决方案,但事实证明我错过了一些东西。
重读该方法的讨论后keysPathsForValuesAffectingValueForKey:
in the NSKeyValueObserving 协议参考,我明白了下面这句话的意思:
当键的观察者注册到接收类的实例时,键值观察本身会自动观察同一实例的所有键路径,并在其中任何一个的值发生变化时向观察者发送键的更改通知关键路径发生变化。
简而言之,您的实例应该有一个观察者来观察您的属性的变化<key>
:
[myInstance addObserver:myObserver forKeyPath:attributeKey options:nil context:nil];
一旦你注册了观察者,协议就会调用keysPathsForValuesAffectingValueForKey
对于您的特定属性键。如果此方法返回一组非空的关键路径,如果对这些关键路径中的任何一个进行更改,KVO 除了通知您属性的任何直接更改之外,还将发出属性的更改通知。
关系键确实会被自动调用,因为 Core Data 已经使用观察者来保持逆关系最新。
在特定情况下,您希望某个属性依赖于同一实体内的另一个属性或关系,您必须:
- 在 awakeFromInsert: 方法中添加一个观察者
addObserver:forKeyPath:options:context:
- 实施
keyPathsForValuesAffectingValueForKey:
or keyPathsForValuesAffecting<key>
- 实施
observeValueForKeyPath:ofObject:change:context
让您的属性键路径对相关更改通知起作用,即更新您的属性值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)