2010-07-04 497 views
0

我有在CoreData中存儲樹結構的應用程序。 有一個ManagedObject, 「項目」,它具有屬性:基於另一個對象屬性填充CoreData ManagedObject屬性

  • 的itemId(串)
  • 列表項
  • 標題(字符串)
  • 的parentId(串)
  • 父(關係項)
  • parentTitle(串)

的parentId點另一個Item對象。

我如何讓屬性parentTitle自動填充父項的標題?

回答

1

雖然Martin的建議是派生值的一個很好的解決方案,但我對你的問題是,你爲什麼要這麼做?你永遠不會操縱父母的價值。因爲你只是訪問它,直接通過KVC訪問父如:

Item *item = ...; 
NSString *title = [item valueForKeyPath:@"parent.title"]; 
//Do something with title 

你想使用keyPathsForValues...功能的唯一情況是,如果你正在改變基於該值的東西。如果您只是訪問它,請直接使用KVC。

1

這是爲了實現期望的功能的可能性:

// implement in Item.m 
// manages KVO notifications 
+ (NSSet *)keyPathsForValuesAffectingParentTitle 
{ 
    return [NSSet setWithObjects:@"parent.title", nil]; 
} 

// getter for parentTitle 
- (NSString*) parentTitle 
{ 
    return [self valueForKeyPath:@"parent.title"]; 
} 

另外聲明屬性parentTitle在Item.h 爲只讀無需聲明一個核心數據的屬性「parentTitle」。

我用這個解決方案中看到的唯一的問題是:

  • 項目A是B項的父
  • 一個被變成故障
  • B是仍然活躍,一些觀點是必然B.parentTitle

由於使用keyPathsForValuesAffecting聲明的依賴關係,視圖獲取通知,但對象A已經發生故障(並且在關閉時不能再次無效)d oes核心數據自動處理這樣的故障&觀察問題?

+0

感謝您的解決方案! 擁有這樣的parentTitle屬性是不好的做法嗎?不應該鼓勵通過parent.title始終訪問該值嗎? – Rod 2010-07-04 11:07:15

+0

我認爲馬庫斯給出了一個很好的解釋何時使用哪種解決方案。 – 2010-07-05 06:37:03

相關問題