2014-03-24 97 views
0

我在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。

回答

1

如果你有assetAmount價值的觀察員,或綁定assetAmount的價值,這些觀察員和綁定將被適當地更新影響assetAmount的值發生更改時。然後調用assetAmount getter

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

如果你想在每次調用getter時進行計算,就完成了。

如果您想要將計算值保存在ivar中,那麼您必須確保直接訪問ivar以避免KVO和綁定觸發。 (是一個catch-22)

如果你不希望getter每次計算值,我相信你可以從setters中調用assetAmount的setter來獲得其他值。你甚至不需要valuesAffecting的東西,因爲你會打電話給setter並觸發KVO。

從這個意義上說,如果您希望assetAmount getter每次都進行計算,那麼您需要keyPathsForValuesAffectingValueForKey:只有。如果你想把它保存在伊娃裏,只要在其他值改變時使用它的setter。

(此外,還可以實現keyPathsForValuesAffectingAssetAmount如果你走這條路)

+0

我使用綁定,和你一樣所示,當其它值改變assetAmount的getter被調用。另外,我讓getter執行必要的計算並返回一個新值。但是我對你將如何實現你的最後一段感到困惑......我將如何將這個新的值保存到getter返回? – Cory

+0

你在那裏與primitiveValue的東西 - 這是到核心數據的ivars的方式,據我所知。但是現在我更多地考慮這個問題了,它不會讓事情複雜化,你必須做新的計算才能知道你是否必須做新的計算。另一種方法是讓影響assetAmount的其他三個值的setter發出willChangeValueForKey assetAmount併爲assetAmount設置新的原始值,然後調用didChangeValueForKey assetAmount並觸發對您的自動合成的getter的調用。我會編輯我的答案。 – stevesliva

1
NSArray *affectingKeys = @[@"assetAlternativeCur", @"assetAltCur", @"assetCurrency"]; 

通知運行時系統這3周其他的事情影響到assetAmount價值......所以,當這些變化,你會得到一個通知assetAmount改變,但你的制定者對於其他3個按鍵一個不改變assetAmount工作的吸氣劑的方式..所以你不會有任何改變...

你可以強制這個幾種不同的方式..你的assetAmount吸氣劑可以是動態的,只是計算的價值,然後返回它。

或在您的setter方法等3項,你可以這樣做:

self.assetAmount = self.primativeAssetAmount; 

,但我會考慮馬虎,將可能導致在路上的問題......你應該有一個值和那麼另一種方法是adjustedAssetAmount,它具有格式化的版本...

一個例子就是溫度。

,你有一個property absoluteTemp,和getter爲C和F

getter for C: => absoluteTemp+273.15 

getter for F: => 9/5 * absoluteTemp + 32