同步核心数据中的两个属性

时间:2010-11-09 13:53:28

标签: core-data

我有两个属性,TKelvin和TCelsius。

当我在窗口中更改TKelvin时,应使用TKelvin更新TCelsius - 273.15 和 当我在我的窗口TCelcius中更改时,TKelvin应该自动更新为TCelcius + 273.15。

我尝试了以下代码:

  • (void)setTKelvin:(NSNumber *)newTKelvin;

{

NSNumber *number;

[self willChangeValueForKey:@"TKelvin"];
[self setPrimitiveT:newTKelvin];
[self didChangeValueForKey:@"TKelvin"];

if ([newTKelvin doubleValue] != [[self TCelsius] doubleValue] + 273.15) {
    double tCelsiusValue = [newT doubleValue] - 273.15;
    number = [NSNumber numberWithDouble:tCelsiusValue];
    [self setValue:number forKey:@"TCelsius"];
}

}

这适用于实体(TCelcius已更改)但TCelsius不会在窗口中自动更新。我该怎么办?

1 个答案:

答案 0 :(得分:2)

如果TCelcius始终基于TKelvin值,则只存储其中一个值并根据需要计算另一个值会更简单。您可以从对象模型中删除TCelcius属性。这将使两个值保持同步。

在标题

中定义TCelcius属性
@property (assign) NSNumber *TCelcius;

添加keyPathsForValuesAffectingValueForKey以允许KVO和Bindings知道您的TCelcius值取决于TKelvin值。

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
    NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];

    if ([key isEqualToString:@"TCelcius"]) {
        NSSet *affectingKeys = [NSSet setWithObjects:@"TKelvin", nil];
        keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKeys];
    }

    return keyPaths;
}

然后为TCelcius值添加一个getter和setter,重定向到TKelvin值:

- (NSNumber *)TCelcius {
    return [NSNumber numberWithDouble:[[self TKelvin] doubleValue]-273.15];
}

+ (void)setTCelcius:(NSNumber *)newTCelcius {
    [self setTKelvin:[NSNumber numberWithDouble:[[self newTCelcius] doubleValue]+273.15]];
}

确保删除当前的setter并使用动态getter和setter作为TKelvin值。