2011-05-17 10 views
7

Tengo una entidad que contiene los atributos lastName y firstName. Por razones que van más allá del alcance de esta pregunta, quiero un atributo de nombre completo que se calcule como una concatenación de firstName + space + lastName.Atributos calculados transitorios de datos centrales

Como se trata simplemente de un valor calculado, sin necesidad de rehacer/deshacer ni de ninguno de los aspectos más sofisticados de los atributos transitorios (fusión, etc.), mi instinto me indica que anule el método getter para devolver dicho valor calculado. La lectura sugiere que, si hago esto, mi única preocupación sería si es compatible con KVO, lo cual puedo abordar utilizando keyPathsForValuesAffectingVolume para garantizar cambios en las notificaciones de activación de FirstName o lastName para cualquier persona que observe en fullName.

¿E-mail perdiendo cualquier cosa? Estoy revisando porque soy un novato en este entorno.

Wayne

Respuesta

2

también soy nuevo en esto, así que no estoy completamente seguro de mi respuesta, pero como yo lo entiendo que son correctos.

- (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

Hi Mark. Gracias por responder. Mi única pregunta tiene que ver con sus llamadas a [self primitiveFullName: nil] y [self primitiveFullName: tmp]. Si la única forma en que un usuario puede acceder a su valor es a través de su getter, y el getter siempre devuelve el valor correcto, ¿por qué se preocupa por lo que se está almacenando para la propiedad transitoria? Tenga en cuenta que sospecho que tiene toda la razón al hacerlo ... Solo estoy pescando para ver si me falta algo de sutileza en todo esto. – wayne

+0

Hola Mark. Además, por curiosidad, ¿por qué puede usar el formulario: [selfsetPrimitiveFirstName: aFirstName] para establecer el valor primitivo, mientras que me veo obligado a usar el formulario: [self setPrimitiveValue: aFirstName forKey: @ "firstName"]? De nuevo, ¡solo pesca! – wayne

+0

Whoops. No me di cuenta de que estaba usando primitiveFullName: en lugar de setPrimitiveFullName: –

Cuestiones relacionadas