【问题标题】:Core Data: Observing changes in related entities核心数据:观察相关实体的变化
【发布时间】:2011-09-04 15:17:11
【问题描述】:

我有一个示例托管对象模型,如下图所示。我想要发生的是:当作为 Bar 对象中货币关系值的对象发生更改时,自动将同一对象设置为与该 Bar 相关的所有 Foos 中的货币关系foos 关系。

我是否理解这可以通过 KVO 完成?我的倾向是首先将其添加到 Foo.m:

+ (NSSet *)keyPathsForValuesAffectingCurrency {
    return [NSSet setWithObject:@"bar.currency"];
}

但我不知道这是否正确,或者我将如何进一步进行。感谢您的建议。

【问题讨论】:

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


    【解决方案1】:

    您想要完成的事情当然是可能的,KVO 可以解决这个问题。你只需要实现几件事。

    1。注册以观察影响您的财产的关键

    您可以在对象唤醒时将对象添加为观察者。

    - (void) awakeFromInsert {
      [super awakeFromInsert];
      [self addObserver:self forKeyPath:@"bar.currency" options:NSKeyValueObservingOptionNew context:nil];
    }
    
    // Repeat for awakeFromFetch
    

    请注意,这在这种情况下有效,因为这是一对一的关系。

    2。触发通知时采取行动

    bar.currency 的通知被触发时更新currency 的值

    - (void) observeValueForKeyPath:(NSString *)keyPath
                           ofObject:(id)object
                             change:(NSDictionary *)change
                            context:(void *)context
    {
      if( [keyPath isEqualToString:@"bar.currency"] ) {
        [self setValue:[self valueForKeyPath:@"bar.currency"] forKey:@"currency"];
      }
    
      // The rest of your KVO logic ...
    }
    

    替代方法

    正如您所指出的,这也可以通过实现依赖键来完成

    + (NSSet *)keyPathsForValuesAffectingCurrency {
      return [NSSet setWithObject:@"bar.currency"];
    }
    

    在这种情况下,您必须观察@"currency"。在您的 observeValue... 方法中,您必须改为检查此密钥。最后,您必须使用setPrimitiveValue:forKey 而不是setValue:forKey: 来设置值。这是因为后者会导致新的通知并导致无限循环。

    【讨论】:

      【解决方案2】:

      有几种可能的解决方案:

      1. 覆盖 Bar 中 setCurrency 的设置器以同时更改 Foo 中的货币
      2. 如果Bar的货币发生变化,使用KVO(ADC)更新Foo的关系。小心将 KVO 与 Core Data 结合使用(撤消处理和故障处理很棘手)
      3. 如果这是解决您问题的最佳解决方案,请重新考虑您的数据模型

      【讨论】:

      • 那么对于第一个选项,在 setCurrency 方法中它应该遍历 foos 中的所有 Foo 对象并分别为每个对象设置货币?这是一个有效的选择吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多