2016-07-22 5 views
0

私はキーパスを観察して安全なキー値を実装しようとしています。 workplaceプロパティを持つpersonという名前のデータモデルオブジェクトがあるとしましょう。人は職場を変更しないまで安全なキー値キーパスの観察

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

これは正常に動作します:順番にworkplaceは私が、私は次の呼び出しで観察し、キー値を設定観察したいaddress性質を持っています。すぐにこれが起こるように:

person.workplace = newWorkplace; 

KVCシステムが正しく「キーと値のオブザーバーはまだそれに登録している間oldAddressが割り当て解除された」というアプリケーションがクラッシュします。 (oldAddressは直前の職場の住所です)。

残念ながら、職場が離れていくことをオブザーバーに通知するための '人物'オブジェクトのクラスの実装を調整することはできません。このようなクラッシュを避けるためのパターンはありますか?他の通知を受け取ることができるかもしれませんか? KVCの場合、キーパスはどのように横断されており、このチェーンにアクセスできますか?

答えて

1

編集2

KVOでいくつかのより多くの時間を過ごした後、私はあなたのケースでは、あなたの代わりにworkplace.addressperson.workplace.addressを観察する必要があることを見出しました。 person.workplace.addressを見ると、

1)あなたがオブジェクトを所有していたので、オブジェクトのライフサイクルを完全に制御できます。独自の選択時にObserverを削除できるようになりました。

2)workplaceオブジェクトが変更された場合、KVOメカニズムは新しいworkplaceの新しいaddressを「自動的に」観察します。もちろん、それは新しいaddressをあなたに通知します。

今、workplaceがランダムに置き換えられることを恐れることなく、addressを見ることができます。これはKVOの本当の隠された力の1つです。これにより、サブクラスはライフサイクルについて知らなくてもスーパークラスのオブジェクトを安全に観察できます。

編集1

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

このスレッドでの受け入れ答えは、最良のあなたの状況を説明しました。あなたはworkplaceのライフサイクルを支配していないので、最初にプロパティaddressを観察するべきではありません。デザインに問題があります。オリジナル

あなたは人を対象にキーパスworkplaceを観察することができます。このkeyPathが呼び出されると、workplace.addressのObserverを単に削除します。

[人addObserver:観察者 forKeyPath: "職場" オプション@:[NSKeyValueObservingOptionNew] コンテキスト:NULL];

関連する問題