我在NSMAnagedObject一個entitiy是依賴於其他enititys,所以閱讀Depend Keys的機制的文檔後,我拿出我的子類定製二傳手在NSManagedObject子類
+ (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"];
}
中的以下我的問題是二傳手「setAssetAmount」只有在我直接更改「assetAmount」值時纔會被調用,如果更改keyPathsForValuesAffectingValueForKey中包含的值,setter不會被調用。我是否以這種錯誤的方式去做?我希望每次值發生變化時都可以調用setter。
我使用綁定,和你一樣所示,當其它值改變assetAmount的getter被調用。另外,我讓getter執行必要的計算並返回一個新值。但是我對你將如何實現你的最後一段感到困惑......我將如何將這個新的值保存到getter返回? – Cory
你在那裏與primitiveValue的東西 - 這是到核心數據的ivars的方式,據我所知。但是現在我更多地考慮這個問題了,它不會讓事情複雜化,你必須做新的計算才能知道你是否必須做新的計算。另一種方法是讓影響assetAmount的其他三個值的setter發出willChangeValueForKey assetAmount併爲assetAmount設置新的原始值,然後調用didChangeValueForKey assetAmount並觸發對您的自動合成的getter的調用。我會編輯我的答案。 – stevesliva