我的NSMAnagedObject中有一个依赖于其他实体的实体,因此在阅读Depend Keys上的文档后,我在子类中提出了以下内容
+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
{
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
if ([key isEqualToString:@"assetAmount"]) {
NSArray *affectingKeys = @[@"assetAlternativeCur", @"assetAltCur", @"assetCurrency"];
keyPaths = [keyPaths setByAddingObjectsFromArray:affectingKeys];
}
return keyPaths;
}
- (void)setAssetAmount:(NSDecimalNumber *)assetAmount
{
[self willChangeValueForKey:@"assetAmount"];
if ([[self useAlternativeCur] boolValue] == YES) {
NSDecimalNumber *result;
result = [[self assetConversionRate] decimalNumberByMultiplyingBy:[self assetAlternativeCur]];
[self setPrimitiveAssetAmount:result];
} else {
[self setPrimitiveAssetAmount:assetAmount];
}
[self didChangeValueForKey:@"assetAmount"];
}
我的问题是,仅当我直接更改“ assetAmount”值时,才会调用设置程序“ setAssetAmount”,如果更改了keyPathsForValuesAffectingValueForKey中包含的值,则不会调用设置程序。我会以错误的方式处理吗?我希望每次值更改时都会调用setter。
最佳答案
如果您具有观察者assetAmount的值,或者绑定到assetAmount的值,则当更改影响assetAmount的值时,将适当地更新这些观察者和绑定。然后调用assetAmount getter。
然后,您可以在assetAmount获取器中重新计算要返回的assetAmount。
如果您想在每次调用getter时进行计算,就可以完成。
如果要将计算值保存在ivar中,则必须确保直接访问ivar以避免KVO和绑定触发。 (被抓住22)
如果您不希望getter每次都计算值,我相信您可以从其他值的设置器中调用assetAmount的设置器。您甚至不需要valuesAffecting东西,因为您将要调用setter并触发KVO。
从这种意义上讲,仅当您希望您的assetAmount获取器每次都执行计算时,才需要keyPathsForValuesAffectingValueForKey:如果要将其保存在ivar中,则在其他值更改时只需使用其setter。
(此外,如果您要走那条路线,可以实现keyPathsForValuesAffectingAssetAmount)
关于cocoa - NSManagedObject子类中的自定义 setter ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22616399/