Override på en Coredata-objekt setter
Posted: May 14th, 2010 | Author: anders | Filed under: iphone | Tags: coredata, iphone, objective-c, xcode | No Comments »Om du skapat ett Coredata-objekt med en uppsättning attribut och automat-genererat en klass kan det hända att du vill ändra en set-funktion. I mitt fall ville jag exempelvis nyligen uppdatera “tid för senaste updatering” samtidigt som jag favorit-markerade ett objekt.
I och med att alla Coredata-attribut är @dynamic kan du inte sätta värden som om det vore en vanlig @property utan du använder dig av Key Value Coding:
-(void) setFavourite:(NSNumber *) newFav {
[self willChangeValueForKey:@"favourite"];
[self setPrimitiveValue:newFav forKey:@"favourite"];
[self didChangeValueForKey:@"favourite"];
[self timestamp];
}
Det viktiga här är, för det första, att du använder willChangeValueForKey och didChangeValueForKey. Sen kan du använda setValue: forKey: vilket jag fått att fungera för NSString-attribut, men inte för NSNumber – så använd setPrimitiveValue: forKey: istället. Vad jag förstått är det generellt att föredra.
Då vi ändå är inne på key values så tänkte jag tipsa om key-paths. Letade rätt på en bloggpost som visar lite saker du kan använda det till – exempelvis smidigt söka igenom en NSArray eller NSDictionary.
Spontan kommentar?