gpt4 book ai didi

cocoa - NSManagedObject 子类中的自定义 Setter

转载 作者:行者123 更新时间:2023-12-03 17:39:24 25 4
gpt4 key购买 nike

我的 NSMangedObject 中有一个实体依赖于其他实体,因此在阅读 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”值时,才会调用 setter “setAssetAmount”,如果更改 keyPathsForValuesAffectingValueForKey 中包含的值,则不会调用 setter 。我是否以错误的方式处理这个问题?我希望每次任何值发生变化时都会调用 setter 。

最佳答案

如果您有 assetAmount 值的观察者或与 assetAmount 值的绑定(bind),则当影响 assetAmount 的值发生更改时,这些观察者和绑定(bind)将相应更新。然后调用 assetAmount getter。

在 assetAmount getter 中,您可以重新计算要返回的 assetAmount。

如果您想在每次调用 getter 时都进行计算,那么就完成了。

如果你想将计算值保存在 ivar 中,那么你必须确保直接访问 ivar 以避免 KVO 和绑定(bind)触发。 (是一个 catch-22)

如果您不希望 getter 每次都计算该值,我相信您可以从其他值的 setter 中调用 assetAmount 的 setter 。您甚至不需要 valueAffecting 的东西,因为您将调用 setter 并触发 KVO。

从这个意义上说,如果您希望 assetAmount getter 每次都进行计算,则需要 keyPathsForValuesAffectingValueForKey: 。如果您希望将其保存在 ivar 中,只需在其他值发生变化时使用它的 setter 即可。

(此外,如果您要走这条路线,您可以实现 keyPathsForValuesAffectingAssetAmount)

关于cocoa - NSManagedObject 子类中的自定义 Setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22616399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com