Key-Value Observerer med Facebooks KVOController
6
Del
en
Del
Dette Cyber mandag Envato Tuts + kurs vil bli redusert å bare $ 3. Ikke gå glipp av.
Innledning
Hvis du noen gang har jobbet med KVO (Key-Value Observing) i Cocoa, er sjansen stor for at du har kjørt inn i ulike typer saker. API er ikke stor, og glemme å fjerne en observatør kan føre til minnelekkasjer eller-enda verre-krasj. Facebooks KVOController bibliotek tar sikte på å løse dette problemet.
Hva er nøkkelen-Value Observing?
Hvis du er ny på nøkkelverdien observere eller KVO, anbefaler jeg at du først lese Apples utvikler guide på emnet eller Mattt Thompsons artikkel om NSHipster. For å sitere Apples guide på KVO, "Key-verdi observere gir en mekanisme som gjør at objekter for å bli varslet om endringer til bestemte egenskaper for andre objekter." Mattt definerer KVO som følger, "Key-Value Observing åpner for ad-hoc, evented introspeksjon mellom spesifikke objekt tilfeller ved å lytte etter endringer på en bestemt nøkkel banen." Nøkkelordene er evented Hotell og
-tasten banen
.
Før vi diskutere KVOController biblioteket Jeg vil gjerne ta et øyeblikk å utforske KVO API.
Legge til en Observer
Jeg vil ikke dekke KVO i stor detalj i denne opplæringen, men det er viktig at du forstår kjernen begrepet KVO. Ideen er enkel. Et objekt kan lytte til endringer i spesifikke egenskaper ved et annet objekt. Den observere objektet er lagt til av målobjektet som observatør for en bestemt nøkkel bane.
La oss illustrere dette med et eksempel. Hvis objectB ønsker å bli varslet når navnet tilhører Objecta endres, så Objecta må legge objectB som observatør for nøkkelen banenavnet. Takk til Objective-C er detaljnivå, er koden for å oppnå dette ganske enkel
[Objecta addObserver: objectB forKeyPath: @ "navn" alternativer: NSKeyValueObservingOptionNew kontekst: NULL];
hensyn til endringer
. Når Objecta navn eiendoms endringer, observeValueForKeyPath: ofObject: endring: kontekst: påberopes. Den første parameteren er nøkkelen banen som blir observert av objectB, er den andre parameter gjenstand for nøkkelbanen, er det tredje argumentet en ordbok som beskriver endringene, og det endelige argumentet er konteksten som ble vedtatt som den endelige argumentet for addObserver : forKeyPath: alternativer: kontekst :.
Jeg håper du enig i at dette er ikke veldig elegant. Hvis du gjør utstrakt bruk av KVO, gjennomføring av observeValueForKeyPath: ofObject: endring: kontekst: blir fort lang og kompleks
Fjerne et Observer
Det er viktig å slutte å lytte for endringer når. et objekt er ikke lenger interessert i å motta varsler for en bestemt nøkkel bane. Dette gjøres ved å kalle removeObserver: forKeyPath: eller removeObserver: forKeyPath: kontekst :.
Problemet som alle utviklere går inn på et tidspunkt er enten glemme å ringe removeObserver: forKeyPath: eller ringe removeObserver: forKeyPath: med en nøkkelbanen som ikke blir observert av observatøren. Årsakene til dette er manyfold og er roten til problemet mange utviklere står overfor når man jobber med KVO
Hvis du har glemt å påberope removeObserver. ForKeyPath :, kan du ende opp med en minnelekkasje. Dersom du aktiverer removeObserver: forKeyPath: og objektet ikke er registrert som en observatør et unntak. Kirsebær på kaken er at NSKeyValueObserving protokollen ikke gir en måte å sjekke om et objekt er å observere en bestemt nøkkel bane.
KVOController til unnsetning
Heldigvis, Cocoa teamet på Facebook var like irritert av de ovennevnte spørsmålene som du er, og de kom opp med en løsning, den KVOController biblioteket. I stedet for å gjenoppfinne hjulet, teamet på Facebook besluttet å bygge på toppen av KVO. Til tross for sine mangler, er robust, har bred støtte, og veldig nyttig KVO
KVOController bibliotek legger til en rekke ting til KVO.
smertefri fjerning av observatører
støtte for blokker og tilpassede tiltak
Krav
Før vi kommer i gang, er det viktig å understreke at KVOController bibliotek krever ARC og at minimumsdistribusjons målene er iOS 6 for iOS og 10,7 for OS X.
Installasjon
Jeg er en stor tilhenger av CocoaPods og jeg håper du er også. For å legge til KVOController biblioteket til et prosjekt ved hjelp CocoaPods, legger pod til prosjektets Podfile og kjøre pod oppdatering for å installere biblioteket.
Pod 'KVOController'
Du kan også laste ned den nyeste versjonen av biblioteket fra GitHub og manuelt legge biblioteket ved å kopiere KVOController.h Hotell og KVOController.m
til prosjektet.
Eksempler
initialisering
Det første du trenger å gjøre er å initialisere en forekomst av FBKVOController klassen. Ta en titt på følgende kodebiten i det jeg skaper en FBKVOController eksempel i en visning kontrollerens initWithNibName: bundle: metode Anmeldelser - (id) initWithNibName:. (NSString *) nibNameOrNil bundle: (NSBundle *) nibBundleOrNil {selv = [ ,,,0],super initWithNibName: nibNameOrNil bundle: nibBundleOrNil]; if (egen-) {_KVOController = [FBKVOController controllerWithObserver bolig:]; } Returnere selv;}
Merk at jeg lagrer en referanse til FBKVOController objekt i visningen kontrollerens _KVOController instansvariabel. En flott funksjon av KVOController biblioteket er at observatøren blir automatisk fjernet det øyeblikk FBKVOController objektet deallocated. Med andre ord, det er ikke nødvendig å huske å fjerne observatøren som dette automatisk gjort det øyeblikk FBKVOController objektet deallocated.
Legge til en Observer
Du har flere alternativer for å starte å observere et objekt . Du kan ta den tradisjonelle tilnærmingen ved å påberope observere: nøkkelbane: alternativer: kontekst :. Resultatet er at observeValueForKeyPath: ofObject: endring: kontekst: påberopes når en endring hendelsen finner sted
[_KVOController observere: person nøkkelbane: @ "navn" alternativer: NSKeyValueObservingOptionNew kontekst: NULL];.
Men FBKVOController klasse utnytter også blokker og egendefinerte handlinger som du kan se i følgende kodesnutter. Jeg er sikker på at du enig i at dette gjør arbeidet med KVO mye morsommere
[_KVOController observere. Person nøkkelbane: @ "navn" alternativer: NSKeyValueObservingOptionNew blokk: ^ (id observatør, id objekt, NSDictionary * endring) {//svare på endringer}] [_ KVOController observere: person nøkkelbane: @ "navn" alternativer: NSKeyValueObservingOptionNew handling:selector (nameDidChange:)];
Fjerne et Observer
Selv om observatøren blir automatisk fjernet når den FBKVOController objektet er deallocated, er det ofte nødvendig å stoppe å observere et objekt før observatøren er deallocated. Den KVOController Biblioteket har en rekke metoder for å oppnå dette enkle oppgaven
For å stoppe å observere en bestemt nøkkel banen til et objekt, påberope unobserve. Nøkkelbane: og passerer objektet og nøkkelbanen. Du kan også stoppe observere et objekt ved å påberope unobserve: og pass på objektet du ønsker å slutte å observere. Slik stopper du observerer hvert objekt, kan du sende FBKVOController innvende et budskap om unobserveAll.
uten unntak
Hvis du tar en titt på gjennomføringen av FBKVOController klassen, vil du legge merke til at det holder en intern kartet over gjenstandene og viktige stier observatøren observerer. Den FBKVOController klassen er mer tilgivende enn Apples implementering av KVO. Hvis du forteller FBKVOController objektet for å stoppe observerer et objekt eller nøkkelbanen at den ikke observerer er intet unntak kastes. Det er slik det skal være.
Konklusjon
Selv om KVO er ikke et vanskelig begrep å forstå, å sørge for at observatørene er riktig fjernet og race conditions ikke forårsaker kaos er den virkelige utfordringen når arbeider med KVO.
Jeg oppfordrer deg til å ta en titt på KVOController biblioteket. Men jeg også råde deg til å få en god forståelse av KVO før du bruker det i prosjektene dine, slik at du vet hva dette biblioteket gjør for deg med bak kulissene.