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.
Große Frage;) – Colas