iOS
Key Value Coding-Key Value Observation
Sök…
Anmärkningar
KVC : - Nyckelvärdeskodning
Normalt kan inställningsvariabler nås via egenskaper eller accessorer men KVC ger ett annat sätt att komma åt variabler i form av strängar. På detta sätt fungerar din klass som en ordlista och ditt egendomsnamn till exempel "ålder" blir nyckel och värde som egenskapen innehar blir värde för den nyckeln.
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 : - Key-Value Observer
Mekanismen genom vilken objekt meddelas när det sker någon förändring av någon egendom kallas KVO. Ex.:tangentmeddelande
Exempelvis är personobjekt intresserade av att få ett meddelande när egenskapen AccountBalance ändras i BankAccount-objektet. För att uppnå detta måste Personobjekt registrera sig som en observatör av BankAccount's accountBalance-egenskap genom att skicka ett addObserver: forKeyPath: alternativ: context: meddelande.
Användning av sammanhang för KVO Observation
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
Kontext är viktigt om du skickar din klass för andra att använda. Kontekst låter din klassobservatör verifiera att det är din observatör som kallas.
Problemet med att inte passera en observatör är, om någon underklassar din klass och registrerar en observatör för samma objekt, samma nyckel och han inte passerar ett sammanhang, kan superklassobservatören kallas flera gånger.
En variabel som är unik och intern för din användning är ett bra sammanhang.
För mer information.
Observera en egenskap i en underklass för NSObject
De flesta KVO- och KVC-funktioner är redan implementerade som standard på alla underklasser av NSObject
.
För att börja observera en egenskap med namnet firstName
på ett objekt som heter personObject
gör detta i observationsklassen:
[personObject addObserver:self
forKeyPath:@"firstName"
options:NSKeyValueObservingOptionNew
context:nil];
Objektet som self
i koden ovan refererar till kommer då att få ett observeValueForKeyPath:ofObject:change:context:
meddelande när den observerade nyckelvägen ändras.
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary<NSString *,id> *)change
context:(void *)context
{
NSLog(@"new value of %@ is: %@", keyPath, change[NSKeyValueChangeNewKey]);
}
"Nyckelväg" är en KVC-term. NSObject
underklasser implementerar KVC-funktionalitet som standard.
En instansvariabel med namnet _firstName
kommer att vara tillgänglig @"firstName"
tangenten sökväg @"firstName"
.
En getter-metod med namnet firstName
kommer att kallas vid åtkomst till @"firstName"
, oavsett om det finns en _firstName
instansvariabel eller setFirstName
setter-metod.