2011-05-17 59 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