Kerndaten: Versenden von KVO-Benachrichtigungen für vorübergehende, abgeleitete Eigenschaften
ich habeParent
Entität mit einer benutzerdefinierten Klasse, die eine vorübergehende und abgeleitete (schreibgeschützte) Eigenschaft namens hatDerivedProperty
.
Der Wert vonDerivedProperty
ist abhängig vom Wert vonParent.IndependentProperty1
und so wann immerIndependentProperty1
ändert sich der Wert vonDerivedProperty
wird sich verändern. Jedoch,Parent
hat eine zu viele Beziehung zuChild
(namenschildren
) undDerivedProperty
ist auch abhängig vom Wert vonIndependentProperty2
in allenParent
'sChild
Objekte.
Also wann immerIndependentProperty1
vonParent
oderIndependentProperty2
von einem derChild
gegenstandsänderungen möchte ich keine beobachter darauf hinweisenDerivedProperty
hat sich auch geändert.
Ich bin bisher zu folgendem Code gekommen. Das einzige Problem ist, dass für keine KVO-Benachrichtigungen ausgegeben werdenDerivedProperty
denn wenn ich das versuche inobjectContextDidChange:
dann endet der Code in einer Schleife.
- (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 ;
}
Ich bin mir sicher, dass ich meine Herangehensweise hier völlig überdenken muss. Ich habe versucht, mit KVO zu beobachtenIndependentProperty1
undIndependentProperty2
von der Beziehung zu vielen, aber ich kann einfach nicht scheinen, es richtig zum Laufen zu bringen. Wenn die abgeleitete Eigenschaft nicht von einer zu vielen Beziehung abhängig wäre, könnte ich sie sicher einfach verwendenkeyPathsForValuesAffectingValueForKey:
Aber in einer Beziehung mit vielen Menschen funktioniert das natürlich nicht.
Wie erhalte ich KVO-Benachrichtigungen, die mit einer transienten, abgeleiteten Core Data-Eigenschaft funktionieren, die von einer Zu-Viele-Beziehung abhängig ist?