2016-07-22 39 views
0

我正試圖在keypaths上實現安全的key值觀察。假設我有一個名爲person的數據模型對象,它具有workplace屬性。反過來workplace有一個address屬性,我希望看到,所以我設置鍵值通過以下調用觀察:安全密鑰值觀察keypaths

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

這工作得很好,直到該人不改變工作環境。一旦發生這種情況:

person.workplace = newWorkplace; 

的KVC系統崩潰正確地說,「oldAddress被釋放,而鍵值觀察家仍用它註冊」的申請。 (舊地址是以前工作地點的地址)。

不幸的是,我不能調整'人'對象類的實現來通知觀察者,工作場所將要消失。有沒有什麼模式可以避免這種崩潰?也許可以得到一些其他的通知?在KVC的情況下如何遍歷keypath,並且您是否有權訪問此鏈?

回答

1

編輯2

花更多的時間與志願後,我發現,你的情況,你應該觀察person.workplace.address,而不是workplace.address。當你觀察到person.workplace.address時,你實現了兩件事:

1)由於你擁有person對象,你可以絕對控制你的對象的生命週期。您現在可以在您自己選擇的時間移除Observer。

2)當workplace對象改變時,KVO機制將「自動」觀察新的workplace的新address。當然,它會通知您新的address

現在,您可以觀察address而不用擔心workplace在隨機時間被替換。這是KVO真正隱藏的力量之一。這允許子類在不知道其生命週期的情況下安全地觀察任何超類的對象。

編輯1

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

在這個線程接受的答案最好的描述你的情況。您不應該首先觀察address,因爲您無法控制workplace的生命週期。你有一個設計問題。

原始

您可以在人員對象上觀察的keyPath workplace。當調用這個keyPath時,你只需刪除Observer爲workplace.address

[人的addObserver:觀察家報 forKeyPath:@ 「職場」 選項:[NSKeyValueObservingOptionNew] 方面:NULL];