ios - Core Data keyPathsForValuesAffectingValueForKey 只调用关系,不调用属性

标签 ios core-data key-value-observing

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

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

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

最佳答案

看起来我在几天后找到了解决我自己问题的方法,但事实证明我遗漏了一些东西。

重读方法讨论后keysPathsForValuesAffectingValueForKey:NSKeyValueObserving Protocol Reference ,我明白了下面这句话的意思:

When an observer for the key is registered with an instance of the receiving class, key-value observing itself automatically observes all of the key paths for the same instance, and sends change notifications for the key to the observer when the value for any of those key paths changes.

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

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

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

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

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

  1. 在 awakeFromInsert: 方法中添加一个观察者 addObserver:forKeyPath:options:context:
  2. 实现 keyPathsForValuesAffectingValueForKey:keyPathsForValuesAffecting<key>
  3. 实现 observeValueForKeyPath:ofObject:change:context让您的属性键路径对相关更改通知采取行动,即更新您的属性值。

关于ios - Core Data keyPathsForValuesAffectingValueForKey 只调用关系,不调用属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15618902/

相关文章:

ios - 根据 NSMutableArray 中的计数启用/禁用按钮

ios - fabric crashlytics 日志中缺少行号问题

ios - 将 UIImage 创建为带颜色的边框

ios - 无限显示本地通知

ios - 将 UITableViewCell 中的文本大写

javascript - BreezeJS 如何跟踪属性变化

iphone - 如何从 iOS 应用程序将视频上​​传到 YouTube?

iOS Xcode 如何使用包含自定义对象的自定义对象来保存数据?

ios - 从 JSON 哈希中获取值

Core Data 中的 Swift 元组