关于多对多关系的核心数据依赖属性

时间:2011-01-08 01:17:21

标签: objective-c cocoa core-data

我正在尝试更新NSManagedObject中的自定义属性,只要它与更改有多对多关系的项。我已经覆盖了苹果公司规定的以下方法:

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

在实现中我在更改的对象上添加或删除观察者。问题是当我的基于绑定的UI对数据进行更改时,我的覆盖方法未被调用。我应该怎么做呢?

2 个答案:

答案 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!因此,您应该将依赖值存储在核心数据建模属性中。