2016-07-22 20 views
0

Ich versuche, einen sicheren Schlüsselwert zu implementieren, der auf Schlüsselpfaden beobachtet. Nehmen wir an, dass ich ein Datenmodellobjekt mit dem Namen person mit einer workplace-Eigenschaft habe. Die workplace wiederum haben eine address Eigenschaft, die ich wünschte, so zu beobachten I Schlüsselwert mit dem folgenden Aufruf Beobachtung einzurichten:Sicherer Schlüsselwert Beobachten von Schlüsselpfaden

[person addObserver:theObserver 
     forKeyPath:@"workplace.address" 
      options:NSKeyValueObservingOptionNew 
      context:NULL]; 

Dies funktioniert gut, bis die Person am Arbeitsplatz nicht ändert. Sobald dies der Fall ist:

person.workplace = newWorkplace; 

das KVC System stürzt die Anwendung korrekt zu sagen, dass „oldAddress freigegeben wurde, während Schlüsselwert Beobachter noch bei ihm registriert wurden“. (alt sein) Adresse des vorherigen Arbeitsplatzes eingeben.

Leider kann ich die Implementierung der Klasse von 'Person' Objekt nicht zwicken, um den Beobachter zu benachrichtigen, dass der Arbeitsplatz weggehen wird. Gibt es ein Muster, um diese Art von Crash zu vermeiden? Vielleicht kann man noch andere Benachrichtigungen bekommen? Wie wird der Schlüsselpfad im Fall von KVC durchlaufen und haben Sie Zugriff auf diese Kette?

Antwort

1

Edit 2

Nach etwas mehr Zeit mit KVO verbringen, fand ich, dass in Ihrem Fall sollten Sie person.workplace.address statt workplace.address werden beobachtet. Wenn Sie person.workplace.address beobachten, erreichen Sie 2 Dinge:

1) Da Sie das Objekt besaßen, haben Sie absolute Kontrolle über den Lebenszyklus Ihres Objekts. Sie könnenObserver jetzt zu einem Zeitpunkt Ihrer Wahl entfernen.

2) Wenn workplace Objekt geändert wird, wird der KVO-Mechanismus "automatisch" die neue address des neuen workplace beobachten. Natürlich wird es Sie über die neue address informieren.

Jetzt können Sie die address beobachten, ohne befürchten zu müssen, dass workplace zu zufälliger Zeit ersetzt wird. Dies ist eine der wahren versteckten Kräfte von KVO. Dadurch können Unterklassen die Objekte jeder Oberklasse sicher beobachten, ohne ihre Lebenszyklen zu kennen.

bearbeiten 1

Best practice to remove an object as observer for some KVO property

Die akzeptierte Antwort in diesem Thread beschrieben am besten Ihre Situation. Sie sollten die Eigenschaft address an erster Stelle nicht beobachten, da Sie keine Kontrolle über den Lebenszyklus von workplace haben. Sie haben ein Designproblem.

Original-

Sie können die keyPath workplace auf die Person, Objekt beobachten. Wenn dieser keyPath aufgerufen wird, entfernen Sie einfachObserver für workplace.address.

[person addObserver: The Observer forKeyPath: @ "Arbeitsplatz" Optionen: [NSKeyValueObservingOptionNew] Kontext: NULL];