iOS
Schlüsselwert-Schlüsselwertbeobachtung
Suche…
Bemerkungen
KVC : - Schlüsselwertcodierung
Normalerweise wird auf Instanzvariablen über Eigenschaften oder Zugriffsmethoden zugegriffen. KVC bietet jedoch eine andere Möglichkeit, auf Variablen in Form von Zeichenfolgen zuzugreifen. Auf diese Weise verhält sich Ihre Klasse wie ein Wörterbuch, und der Name Ihrer Eigenschaft, zum Beispiel "age", wird zum Schlüssel und Wert, den die Eigenschaft enthält, wird zum Wert für diesen Schlüssel.
For example, you have employee class with "age" property. Normally we access like this.
emp.age = @”20″;
NSString age = emp.age;
But KVC works like this:
[emp valueForKey:@"age"];
[emp setValue:@"25" forKey:@"age"];
KVO : - Schlüsselwertbeobachter
Der Mechanismus, durch den Objekte benachrichtigt werden, wenn eine Eigenschaft geändert wird, wird als KVO bezeichnet. Beispiel: Tastaturbenachrichtigung
Beispielsweise ist ein Personenobjekt daran interessiert, eine Benachrichtigung zu erhalten, wenn die accountBalance-Eigenschaft im BankAccount-Objekt geändert wird. Um dies zu erreichen, muss sich Person Object als Beobachter der Eigenschaft accountBalance der BankAccount registrieren, indem ein addObserver: forKeyPath: options: context: message gesendet wird.
Verwendung des Kontextes für die KVO-Beobachtung
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
Der Kontext ist wichtig, wenn Sie Ihre Klasse für andere Benutzer versenden. Mit dem Kontext kann Ihr Klassenbeobachter überprüfen, ob er von Ihnen aufgerufen wird.
Das Problem, einen Beobachter nicht zu übergeben, besteht darin, dass, wenn jemand Ihre Klasse unterordnet und einen Beobachter für dasselbe Objekt, denselben Schlüssel registriert und keinen Kontext übergibt, der Superklassenbeobachter mehrfach aufgerufen werden kann.
Eine für Ihre Verwendung eindeutige und interne Variable ist ein guter Kontext.
Für mehr Informationen.
Beobachten einer Eigenschaft einer NSObject-Unterklasse
Die meisten KVO- und KVC-Funktionen sind bereits standardmäßig in allen NSObject
Unterklassen NSObject
.
Um eine Eigenschaft namens firstName
eines Objekts namens personObject
führen Sie dies in der beobachtenden Klasse aus:
[personObject addObserver:self
forKeyPath:@"firstName"
options:NSKeyValueObservingOptionNew
context:nil];
Das Objekt, auf das sich self
im obigen Code bezieht, erhält dann eine observeValueForKeyPath:ofObject:change:context:
-Nachricht, wenn sich der beobachtete Schlüsselpfad ändert.
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary<NSString *,id> *)change
context:(void *)context
{
NSLog(@"new value of %@ is: %@", keyPath, change[NSKeyValueChangeNewKey]);
}
"Schlüsselpfad" ist ein KVC-Begriff. NSObject
Unterklassen implementieren standardmäßig die KVC-Funktionalität.
Auf eine Instanzvariable mit dem Namen _firstName
kann über den Schlüsselpfad @"firstName"
.
Eine Getter-Methode mit dem Namen firstName
wird aufgerufen, wenn auf den Schlüsselpfad @"firstName"
wird, unabhängig davon, _firstName
es eine _firstName
oder setFirstName
Setter-Methode setFirstName
.