我有一个示例托管对象模型,如下图所示。我想要发生的是:当作为 Bar 对象中货币关系值的对象发生更改时,自动将同一对象设置为通过 Bar 相关的所有 Foos 中的货币关系foos关系。
我理解这可以通过 KVO 完成吗?我倾向于首先将其添加到 Foo.m:
+ (NSSet *)keyPathsForValuesAffectingCurrency {
return [NSSet setWithObject:@"bar.currency"];
}
但我不知道这是否正确或我将如何进一步进行。感谢您的任何建议。
最佳答案
您想要完成的事情当然是可能的,KVO 可以解决这个问题。您只需要实现几件事。
1。注册观察影响您属性(property)的关键
您可以在您的对象处于唤醒状态时将您的对象添加为观察者。
- (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:
来设置值。这是因为后者会引起新的通知并导致死循环。
关于objective-c - 核心数据 : Observing changes in related entities,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6173534/