我正在尝试更新NSManagedObject中的自定义属性,只要它与更改有多对多关系的项。我已经覆盖了苹果公司规定的以下方法:
- (void)addDevicesObject:(Device *)value;
- (void)removeDevicesObject:(Device *)value;
- (void)addDevices:(NSSet *)value;
- (void)removeDevices:(NSSet *)value;
在实现中我在更改的对象上添加或删除观察者。问题是当我的基于绑定的UI对数据进行更改时,我的覆盖方法未被调用。我应该怎么做呢?
答案 0 :(得分: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];
}
答案 1 :(得分:2)
这是我在一点github project
中解决的问题使用观察来解决问题是一种可能的方法,仍然需要考虑许多核心数据特定的故障(观察故障对象的属性)和撤消/重做/删除。如果你想保持10.5兼容,那么重要的方法awakeFromSnapshotEvent也会丢失,你需要一个解决方法来激活观察以在上下文保存后撤消删除对象。
二传手:
- (void)setDevices:(NSSet *)newDevices
如果你想避免观察可能很复杂的事情,也应该在绑定中调用。 在撤消/重做操作中不调用setter!因此,您应该将依赖值存储在核心数据建模属性中。