【问题标题】:Core Data keyPathsForValuesAffectingValueForKey only calling relationships, not attributesCore Data keyPathsForValuesAffectingValueForKey 只调用关系,不调用属性
【发布时间】:2013-03-25 15:39:59
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    重读了NSKeyValueObserving Protocol Reference中对方法keysPathsForValuesAffectingValueForKey:的讨论,才意识到下面这句话的意思:

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

    简而言之,你的实例应该有一个观察者观察你的属性<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 以对相关更改通知采取行动,即更新您的属性值。

    【讨论】:

    • 不错的侦探工作!你介意发布一些示例代码吗?我的大脑更容易理解代码而不是文字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    相关资源
    最近更新 更多