2011-05-17 58 views
7

我有一個包含lastName和firstName屬性的實體。由於超出這個問題範圍的原因,我想要一個fullName屬性,它被計算爲firstName + space + lastName的串接。因爲這純粹是一個計算值,不需要重做/撤消或任何其他更復雜的瞬態屬性(合併等),我的直覺告訴我只是重寫getter方法來返回所說的計算值。閱讀表明,如果我這樣做,我唯一擔心的是它是否符合KVO,我可以通過使用keyPathsForValuesAffectingVolume來確保對firstName或lastName的更改觸發任何在fullName上觀察的任何人的通知。核心數據瞬態計算的屬性

我錯過了什麼?我正在檢查,因爲我是這個環境的新手。

韋恩

回答

2

我也是新來這個,所以我不能完全肯定我的答案,但據我所知,你是正確的。

- (NSString *)fullName 
{ 
    [self willAccessValueForKey:@"fullName"]; 
    NSString *tmp = [self primitiveFullName]; 
    [self didAccessValueForKey:@"fullName"]; 

    if (!tmp) { 
     tmp = [NSString stringWithFormat:@"%@ %@", [self firstName], [self lastName]]; 
     [self setPrimitiveFullName:tmp]; 
    } 
    return tmp; 
} 

- (void)setFirstName:(NSString *)aFirstName 
{ 
    [self willChangeValueForKey:@"firstName"]; 
    [self setPrimitiveFirstName:aFirstName]; 
    [self didChangeValueForKey:@"firstName"]; 

    [self setPrimitiveFullName:nil]; 
} 

- (void)setLastName:(NSString *)aLastName 
{ 
    [self willChangeValueForKey:@"lastName"]; 
    [self setPrimitiveLastName:aLastName]; 
    [self didChangeValueForKey:@"lastName"]; 

    [self setPrimitiveFullName:nil]; 
} 

+ (NSSet *)keyPathsForValuesAffectingFullName 
{ 
    return [NSSet setWithObjects:@"firstName", @"lastName", nil]; 
} 
+0

嗨馬克。感謝您的迴應。我唯一的問題與你對[self primitiveFullName:nil]和[self primitiveFullName:tmp]的調用有關。如果用戶可以訪問您的值的唯一方式是通過您的getter,並且getter總是返回正確的值,那麼爲什麼您要關心爲transient屬性存儲的內容?請注意,我懷疑你這樣做是絕對正確的......我只是在釣魚,看看我是否錯過了這一切的微妙之處。 – wayne 2011-05-18 07:14:22

+0

嗨馬克。另外,出於好奇,爲什麼你能夠使用下面的形式:[self setPrimitiveFirstName:aFirstName]來設置原始值,而我被迫使用下面的形式:[self setPrimitiveValue:aFirstName forKey:@「firstName」]?再一次,只是釣魚! – wayne 2011-05-18 07:40:21

+0

哎呦。沒有意識到我使用的是primitiveFullName:而不是setPrimitiveFullName: – 2011-05-18 08:26:02