核心数据:观察相关实体的变化

| 我有一个下图所示的示例管理对象模型。我想发生的事情是:当更改作为Bar对象中货币关系的值的对象时,要自动将同一对象设置为与该Bar相关的所有Foos中的货币关系,通过foos关系。 我是否可以通过KVO做到这一点,对吗?我倾向于将其添加到Foo.m中:
+ (NSSet *)keyPathsForValuesAffectingCurrency {
    return [NSSet setWithObject:@\"bar.currency\"];
}
但我不知道这是对的还是我将如何进一步进行。感谢您的任何建议。     
已邀请:
        您想要实现的目标当然是可能的,并且KVO可以解决这一问题。您只需要实现几件事即可。 1.注册以查看对您的财产有影响的钥匙 您可以在对象唤醒时将其添加为观察者。
- (void) awakeFromInsert {
  [super awakeFromInsert];
  [self addObserver:self forKeyPath:@\"bar.currency\" options:NSKeyValueObservingOptionNew context:nil];
}

// Repeat for awakeFromFetch
请注意,在这种情况下这是可行的,因为这是一对一的关系。 2.发出通知后采取行动 触发“ 3”通知时更新“ 2”的值
- (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\"
。在您的“ 7”方法中,您将不得不检查该密钥。最后,您必须使用
setPrimitiveValue:forKey
而不是
setValue:forKey:
来设置值。这是因为后者会引起新的通知并导致无限循环。     
        有几种可能的解决方案: 覆盖Bar中的setCurrency的设置者,也可以更改Foo中的货币 如果Bar的货币发生更改,请使用KVO(ADC)更新Foo的关系。将KVO与核心数据结合使用时要小心(撤消处理和故障很棘手) 如果这是解决问题的最佳解决方案,请重新考虑数据模型     

要回复问题请先登录注册