2011-01-08 118 views
2

我試圖更新NSManagedObject中的自定義屬性,只要它與變化有多對多關係的項目。我已經覆蓋了蘋果公司規定的以下方法:核心對多對多關係的數據依賴屬性

- (void)addDevicesObject:(Device *)value; 
- (void)removeDevicesObject:(Device *)value; 
- (void)addDevices:(NSSet *)value; 
- (void)removeDevices:(NSSet *)value; 

並且在實現中我添加或刪除了更改對象的觀察者。問題是當我的基於綁定的UI對數據進行更改時,我的覆蓋方法不會被調用。我應該如何去做這件事?

回答

2

如果自定義屬性是在請求時計算的,則使用+ keyPathsForValuesAffectingValueForKey:在設備更改時觸發更新通知。

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key { 
    if([key isEqualToString:@"MyCustomProperty"]) return [NSSet setWithObject:@"devices"]; 
    return [super keyPathsForValuesAffectingValueForKey:key]; 
} 

如果您想在僅更改設備時執行計算,則使用KVO在更改設備時收到通知。

//Put this in the various awake... methods 
[self addObserver:self forKeyPath:@"devices" options:0 context:nil]; 
//Put this in the didTurnIntoFault method 
[self removeObserver:self forKeyPath:@"devices"]; 

- (void)observeValueForKeyPath:(NSString *)path ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if(object == self && [path isEqualToString:@"devices"]) { 
     //Update custom property here 
    } else [super observeValueForKeyPath:path ofObject:object change:change context:context]; 
} 
+0

閱讀您的答案我已經意識到,我真的需要做的是執行重新計算,無論何時設備更改或device.type更改,這是否意味着我需要觀察集合中的每個設備上的類型屬性? – grivescorbett 2011-01-08 04:56:16

+0

基本上,是的,但你可以使用一個NSArrayController爲你自動完成。將控制器的內容綁定到設備密鑰,並觀察控制器上的佈線對象類型。如果你喜歡,我可以添加到我的文章。 – ughoavgfhw 2011-01-08 06:33:33

2

這是我在一個小github project

解決使用observings來解決問題相同的問題是一個可行的辦法,但你仍需要考慮很多核心數據與斷層(觀察的屬性具體問題一個錯誤對象)和撤銷/重做/刪除。如果您想保持10.5兼容,那麼重要的方法awakeFromSnapshotEvent也會丟失,您需要一種解決方法來激活觀察以在上下文保存後撤消刪除對象。

setter方法:

- (void)setDevices:(NSSet *)newDevices 

也應該在綁定,如果你想避免observings可併發調用。 安裝程序不會在撤消/重做操作中調用!所以你應該將你的依賴值存儲在覈心數據建模的屬性中。