如果自定義屬性是在請求時計算的,則使用+ 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];
}
閱讀您的答案我已經意識到,我真的需要做的是執行重新計算,無論何時設備更改或device.type更改,這是否意味着我需要觀察集合中的每個設備上的類型屬性? – grivescorbett 2011-01-08 04:56:16
基本上,是的,但你可以使用一個NSArrayController爲你自動完成。將控制器的內容綁定到設備密鑰,並觀察控制器上的佈線對象類型。如果你喜歡,我可以添加到我的文章。 – ughoavgfhw 2011-01-08 06:33:33