我的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/

10-11 00:32