То, чего вы хотите достичь, безусловно, возможно, и КВО может позаботиться об этом.Вам просто нужно реализовать несколько вещей.
1.Зарегистрируйтесь для наблюдения за ключом, влияющим на вашу собственность
Вы можете добавить свой объект в качестве наблюдателя, когда ваш объект просыпается.
- (void) awakeFromInsert {
[super awakeFromInsert];
[self addObserver:self forKeyPath:@"bar.currency" options:NSKeyValueObservingOptionNew context:nil];
}
// Repeat for awakeFromFetch
Обратите внимание, что это работает в этом случае, так как этоотношение один к одному.
2.Принять меры при срабатывании уведомления
Обновите значение currency
при срабатывании уведомления для bar.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:
.Это потому, что последний вызовет новое уведомление и приведет к бесконечному циклу.