iOS
Key Value Coding-Key Value Observation
Zoeken…
Opmerkingen
KVC : - Key-Value codering
Normaal worden instantievariabelen benaderd via eigenschappen of accessors, maar KVC biedt een andere manier om toegang te krijgen tot variabelen in de vorm van strings. Op deze manier gedraagt uw klas zich als een woordenboek en wordt uw eigenschapsnaam, bijvoorbeeld 'leeftijd', sleutel en wordt de waarde die eigendom heeft, waarde voor die sleutel.
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-waarnemer
Het mechanisme waarmee objecten op de hoogte worden gebracht wanneer er een wijziging is in een eigenschap wordt KVO genoemd. Bijv .: toetsenbordmelding
Persoonobject is bijvoorbeeld geïnteresseerd in een melding wanneer de eigenschap accountBalance wordt gewijzigd in het BankAccount-object. Om dit te bereiken, moet Person Object zich als waarnemer van de eigenschap AccountBalance van de BankAccount registreren door een addObserver: forKeyPath: options: context: message te verzenden.
Gebruik van context voor KVO-observatie
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
Context is belangrijk als u uw klas verzendt zodat anderen deze kunnen gebruiken. Context laat uw klaswaarnemer verifiëren dat u de waarnemer bent die wordt genoemd.
Het probleem met het niet passeren van een waarnemer is dat, als iemand je klas subklasseert en een waarnemer registreert voor hetzelfde object, dezelfde sleutel en hij geen context passeert, de superklasse-waarnemer meerdere keren kan worden genoemd.
Een variabele die uniek en intern is voor uw gebruik is een goede context.
Voor meer informatie.
Een eigenschap van een NSObject-subklasse observeren
De meeste KVO- en KVC-functionaliteit is al standaard geïmplementeerd op alle NSObject
subklassen.
Ga als volgt te werk om een eigenschap met de naam firstName
van een object met de naam personObject
gaan observeren:
[personObject addObserver:self
forKeyPath:@"firstName"
options:NSKeyValueObservingOptionNew
context:nil];
Het object waarnaar self
in de bovenstaande code verwijst, ontvangt vervolgens een observeValueForKeyPath:ofObject:change:context:
bericht wanneer het waargenomen sleutelpad verandert.
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary<NSString *,id> *)change
context:(void *)context
{
NSLog(@"new value of %@ is: %@", keyPath, change[NSKeyValueChangeNewKey]);
}
"Sleutelpad" is een KVC-term. NSObject
subklassen implementeren standaard KVC-functionaliteit.
Een instantievariabele met de naam _firstName
is toegankelijk via het sleutelpad @"firstName"
.
Een getter-methode met de naam firstName
wordt aangeroepen bij toegang tot het sleutelpad @"firstName"
, ongeacht of er een _firstName
instantievariabele of setFirstName
setter-methode is.