Основные данные: отправка уведомлений KVO для переходных, производных свойств
у меня естьParent
объект с пользовательским классом, который имеет временное и производное (только для чтения) свойство, называемоеDerivedProperty
.
ЗначениеDerivedProperty
зависит от стоимостиParent.IndependentProperty1
и так всякий раз, когдаIndependentProperty1
изменения, стоимостьDerivedProperty
изменится. Тем не мение,Parent
имеет отношение ко многимChild
(называетсяchildren
) а такжеDerivedProperty
также зависит от стоимостиIndependentProperty2
во всехParent
«sChild
объекты.
Так что всякий раз, когдаIndependentProperty1
изParent
или жеIndependentProperty2
любого изChild
изменения объектов, я хотел бы уведомить любых наблюдателей, чтоDerivedProperty
также изменился.
Я пришел к следующему коду. Единственная проблема заключается в том, что уведомления KVO не отправляются дляDerivedProperty
так как если я попытаюсь сделать это вobjectContextDidChange:
тогда код окажется в цикле.
- (void) awakeFromInsert
{
[super awakeFromInsert];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(objectContextDidChange:) name:NSManagedObjectContextObjectsDidChangeNotification object:self.managedObjectContext];
}
- (void) awakeFromFetch
{
[super awakeFromFetch];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(objectContextDidChange:) name:NSManagedObjectContextObjectsDidChangeNotification object:self.managedObjectContext];
}
- (void) objectContextDidChange: (NSNotification *) notification
{
NSSet *updatedObjects = [[notification userInfo] objectForKey:NSUpdatedObjectsKey];
if ([updatedObjects containsObject:self] || [updatedObjects intersectsSet:self.children])
{
//clear caches
_derivedProperty = nil;
}
}
- (void) didTurnIntoFault
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (NSString *) DerivedProperty
{
if (_derivedProperty == nil)
{
_derivedProperty = [self someExpensiveCalculation];
}
return _derivedProperty ;
}
Я уверен, что мне нужно полностью пересмотреть мой подход здесь. Я пытался использовать КВО, чтобы наблюдатьIndependentProperty1
а такжеIndependentProperty2
отношения ко многим, но я просто не могу понять, как это работает правильно. Если производное свойство не зависело от отношения ко многим, то я уверен, что я мог бы просто использоватьkeyPathsForValuesAffectingValueForKey:
но, конечно, это не сработает во многих отношениях.
Как получить уведомления KVO, работающие с временным производным свойством Core Data, которое зависит от отношения ко многим?