Fortsättning på ett tidigare inlägg om KVC . Nu ser vi på nyckel-värde-observation.
KVO i Cocoa
Ola Bäckström 19 juni 2008
Jag tänker inte gå i detalj på hur KVO används därför att man i själva verket ska använda Bindings i stället… men några korta ord.
KVO löser problemet att få reda på när andra objekts properties/attribut förändras. Specifikt så kan man säga att KVO ser till att registrerade observatörer får reda på förändringar. Ansvaret för att hålla ordning på observatörer och vilka attribut som är observerade är lagt på det observerade objektet. KVO har alltså ingen central notifikationstjänst, så det hela är inte byggt runt NSNotification
.
Själva hålla-ordning-på-allt-joxet sker under ytan, halvvägs ned i obj-c-runtimen, långt bortom min begreppsvärld. Till exempel så byts ISA-värdena ut på observerade objekt (isa-swizzling) och ersätts med något slags proxy som gör … ja vadå?
I praktiken går det ut på att använda metoderna i det informella protokollet NSKeyValueObserving
:
addObserver:forKeyPath:options:context:
observeValueForKeyPath:ofObject:change:context:
removeObserver:forKeyPath:
Dessa metoder har en vettig implementation redan i NSObject, så i stort sett alla dina objekt kan ta rollerna som observerat eller observerande objekt.
Nedan ett sekvensdiagram som visar att man kan få notiser både före och efter en förändring av ett övervakat attribut.
Om för många notiser går ut (kanske för att en hel list-attribut förändras på en gång) kan man välja att manuellt styra upp notis-processen med willChangeValueForKey:
och didChangeValueForKey:
, se Manual Observer Notification . Detta görs internt på det objekt som ska observeras.
En sista sak, flera observatörer kan välja att observera attribut på ett och samma objekt. De kan observera samma attribut eller olika attribut, spelar ingen roll.
« Programspråk för barn (och vuxna med barnasinne!) Egen samlingsvy i Cocoa »