Основные данные: отправка уведомлений KVO для переходных, производных свойств
я имеюParent
объект с пользовательским классом, который имеет временное и производное (только для чтения) свойство с именем.DerivedProperty
ЗначениеDerivedProperty
зависит от стоимостиParent.IndependentProperty1
и так всякий раз, когдаIndependentProperty1
изменения, стоимостьDerivedProperty
изменится. Тем не мение,Parent
имеет отношение ко многимChild
(называетсяchildren
) а такжеDerivedProperty
также зависит от стоимостиIndependentProperty2
во всехParent
Child
объекты.
Так что всякий раз, когда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
отношения ко многим, но я просто могуКажется, он работает правильно. Если производное свойство не былоT зависит от отношения ко многим, то яуверен, я мог бы просто использоватьkeyPathsForValuesAffectingValueForKey:
но, конечно, это победилоработать через отношения ко многим.
Как получить уведомления KVO, работающие с временным производным свойством Core Data, которое зависит от отношения ко многим?