Основные данные переходных вычисляемых атрибутов - PullRequest
7 голосов
/ 17 мая 2011

У меня есть объект, который содержит атрибуты lastName и firstName.По причинам, выходящим за рамки этого вопроса, я хочу, чтобы атрибут fullName вычислялся как конкатенация firstName + space + lastName.

Поскольку это чисто вычисляемое значение, без необходимости повторять / отменять или выполнять какие-либо действияВ другом из более сложных аспектов переходных атрибутов (слияние и т. д.) моя интуиция говорит мне просто переопределить метод getter для возврата указанного вычисленного значения.Чтение предполагает, что, если я сделаю это, моей единственной заботой будет вопрос о том, является ли он совместимым с KVO, и я могу решить эту проблему, используя keyPathsForValuesAffectingVolume, чтобы гарантировать изменения уведомлений триггера firstName или lastName для всех, кто наблюдает за fullName.

Я пропустилчто-нибудь?Я проверяю, потому что я новичок в этой среде.

1 Ответ

2 голосов
/ 17 мая 2011

Я тоже новичок в этом, поэтому не совсем уверен в своем ответе, но, насколько я понимаю, вы правы.

- (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];
}
...