2010-09-16 3 views
18

Ich habe eine benutzerdefinierte Unterklasse, sagen wir Person. Ich habe auch eine UIView registriert mit -addObserver:forKeyPath:options:context:, um verschiedene Eigenschaften eines Person zu beobachten, von denen einige wie "Name" persistent sind und andere sind nur dumme KVO-konforme Accessoren unabhängig von Core Data, wie "trinken".NSManagedObject und KVO vs Dokumentation

@interface Person : NSManagedObject 
{ 
    BOOL drinking; 
} 
@property (nonatomic, retain) NSString* name; 
@property (nonatomic, readonly) BOOL drinking; 
@end 

@implementation Person 
@dynamic name; 
... 
- (void) getDrunk { 
    [self willChangeValueForKey: @"drinking"]; 
    drinking = YES; 
    [self didChangeValueForKey: @"drinking"]; 
} 
... 
@end 

Alles funktioniert. Immer, wenn ich -getDrunk sende oder die Eigenschaft name setze, wird die Ansicht benachrichtigt. Ich bin ein glücklicher Mensch, außer wenn ich lese NSManagedObject docs die besagen:

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key 

Fact 1. YES, wenn der Empfänger bietet automatische Unterstützung für Schlüssel-Wert-Beobachtung Änderungsbenachrichtigungen für Schlüssel, andernfalls NO.

Fakt 2. Die Standardimplementierung für NSManagedObject gibt NO für modellierte Eigenschaften und YES für nicht modellierte Eigenschaften zurück.

Jetzt versuche ich, die oben genannten zwei Fakten aus den Dokumenten zu analysieren. Das Überprüfen von Fakt 2 ist einfach und die Klasse Person gibt tatsächlich NEIN für @ "name" und JA für @ "trinkend" zurück. Aber wie wird die Ansicht benachrichtigt, wenn sich der Name ändert? KVO docs klar sagen,

automatische Beobachter-Benachrichtigungen verwenden, ist es notwendig, nicht an der Halterung Änderungen an einer Eigenschaft mit Anrufungen von willChangeValueForKey: und didChangeValueForKey: wenn Eigenschaften über Schlüssel-Wert-Codierung und Schlüssel-Wert-Codierung konformen Methoden mutiert.

Also, wenn Person NEIN zurückgibt von +automaticallyNotifiesObserversForKey: für @ "namen", so scheint es, dass ich manuell den Namen Setter in will/didChangeValueForKey: wickle für KVO zu arbeiten. Allerdings funktioniert KVO ganz gut. Was vermisse ich? Was ist der Punkt in überschreiben +automaticallyNotifiesObserversForKey: und dokumentiert es, wenn nicht Standard KVO Verhalten zu ändern scheint?

Bitte, hilf mir, meine geistige Gesundheit wiederzuerlangen.

+2

Große Frage;) – Colas

Antwort

16

Nun, NSManagedObject bietet eine Implementierung für die name Eigenschaft (sowie die - name und - setName: Methoden). Ich nehme an, dass die von Core Data bereitgestellten Implementierungen Aufrufe an willChangeValueForKey: und didChangeValueForKey: enthalten.

Also, auch wenn die KVO „automatisch“ in dem Sinne, dass man nichts zu tun hat, damit es funktioniert, könnte ich mich vorstellen, dass es nicht automatische in dem Sinne, dass willChangeValueForKey: und didChangeValueForKey: genannt werden durch die Methoden in NSManagedObject, die die dynamischen Eigenschaften Implementierungen bereitstellen.

+2

Ihre Erklärung ergibt Sinn. Danke vielmals! – Costique