Mam NSManagedObject
z dwóch właściwości:Autoupdating NSManagedObject modyfikacja właściwość timestamp
NSNumber *score;
NSDate *score_timestamp;
Chcę moje score_timestamp
pola mają być aktualizowane za każdym razem aktualizować score
.
Oczywiście nie mogę użyć metody -willSave
, ponieważ mój kontekst jest zapisywany od czasu do czasu, a score_timestamp
nie będzie aktualny. Tak więc powinienem zastąpić -setScore:
lub ustawić mój obiekt zarządzany jako obserwator klucz-wartość dla jego własnego pola score
.
Rozwiązanie -setScore:
wydaje się prosta:
- (void) setScore:(NSNumber *)score
{
[self willChangeValueForKey:@"score"];
[self setPrimitiveScore:score];
[self didChangeValueForKey:@"score"];
self.score_timestamp = [NSDate date];
}
Czy są jakieś zastrzeżenia w robienie rzeczy w ten sposób? Czy powinienem użyć rozwiązania KVO?
Aktualizacja
Dotychczas Dostałem dwie odpowiedzi, że mój kod nie będzie działać poprzez setValue: forKey:
i nadal czekam na przykład. Naive dzwoni [(NSManagedObject *)myObject setValue:value forKey:@"score"]
dzwoni do mojego setera.
Więc jeśli przejdę do rozwiązania KVO, czy powinienem addObserver:
we wszystkich metodach awake
i usunąć go w willTurnIntoFault
? Czy to nie jest takie proste?
Poważnie, oba programy odpowiadające stwierdzające, że wartość setValue ... nie będą działać, są nieprawidłowe. Możesz to przetestować dość trywialnie, umieszczając punkt przerwania w swoim akcesorium, a następnie zmieniając wartość za pomocą metody setValue. – jrturton
@jrturton Już testowałem to, to na pewno zostanie wywołane. Ale nie jestem ekspertem od Core Data, aby mieć pewność, że istnieje inny sposób zmiany mojej własności bez dostępu. Mam na myśli sposób, w jaki można używać od czasu do czasu w prawdziwym kodzie. – iHunter
Nie. Wszystkie podstawowe połączenia danych będą przechodzić przez twój ustawnik (prawdopodobnie najpierw za pomocą setValueForKey). To część zasady enkapsulacji. Mógłbyś mieć jakiś dziwaczny bezpośredni dostęp do ivar, ale to musiałoby być coś, co sam napisałbyś, co prawdopodobnie również złamałoby kontekst obiektu zarządzanego. Nie zrobiłbyś tego sobie, prawda? – jrturton