2013-03-25 57 views
4

我正在使用核心數據來模擬具有屬性和關係的實體。我想讓其中一個屬性依賴於另外兩種關係。核心數據keyPathsForValuesAffectingValueForKey只調用關係而不是屬性

核心數據常見問題解答和其他幾個示例爲此使用了​​。但是,這似乎只是爲我的所有關係屬性而調用,但不是用於任何屬性。此外keyPathsForValuesAffecting<key>永遠不會被我的任何屬性調用。

這是正常行爲還是我錯過了什麼?我如何根據其他屬性或屬性計算一個屬性,例如。距離,通過設置一個startLocation和一個stopLocation?

回答

7

它看起來像幾天後發現了我自己的問題的解決方案,結果我失去了一些東西。

NSKeyValueObserving Protocol Reference重讀方法keysPathsForValuesAffectingValueForKey:的討論後,我意識到下面的句子的含義:

當用於鍵觀察者與接收類的實例註冊,鍵 - 值觀察自己會自動觀察同一實例的所有關鍵路徑,並在任何關鍵路徑的值發生更改時將關鍵字的更改通知發送給觀察者。

總之,你的情況應該有一個觀察者觀察更改的屬性<key>

[myInstance addObserver:myObserver forKeyPath:attributeKey options:nil context:nil]; 

只要你註冊一個觀察者,該協議將調用keysPathsForValuesAffectingValueForKey您的特定屬性鍵。如果此方法返回一組非空的鍵路徑,則除了通知您對屬性進行任何直接更改之外,如果對這些鍵路徑中的任何一個進行了更改,KVO將爲您的屬性發出更改通知。

關係鍵會自動調用,因爲Core Data已經使用觀察者來保持反向關係是最新的。

在你想有一個屬性依賴於同一個實體中的另一個屬性或關係在特定情況下,你必須:

  1. 添加在awakeFromInsert觀察員:方法使用addObserver:forKeyPath:options:context:
  2. 實施keyPathsForValuesAffectingValueForKey:keyPathsForValuesAffecting<key>
  3. 實施observeValueForKeyPath:ofObject:change:context您的屬性鍵路徑作用於相關的更改通知,即更新您的屬性值。
+0

不錯的偵探工作!你介意發佈一些示例代碼?我的頭腦比理解代碼更容易理解代碼。 – 2013-10-10 05:20:37