Ключевое значение Наблюдение каскадирования - PullRequest
2 голосов
/ 21 июня 2011

Менять ли каскад уведомлений с помощью KVO на их свойства или есть какой-нибудь изящный способ, который не предусматривает реализацию его вручную, просто наблюдая как родительские, так и дочерние изменения?

Давайте предположим, что у нас есть класс User иКласс документа.Один пользователь может иметь любое количество документов.Теперь давайте предположим, что у меня есть контроллер представления, отображающий подробности о документе, и давайте также предположим, что я где-то храню переменную с именем currentUser.Если я теперь наблюдаю один объект документа, который принадлежит этому одному пользователю, который также является значением currentUser, и я изменяю currentUser на другого пользователя, будет ли уведомление об изменении «каскадным» вплоть до того контроллера представления, который наблюдает только за объектом документа, которыйпринадлежал предыдущему "currentUser"?

1 Ответ

5 голосов
/ 22 июня 2011

Наблюдатель получает только уведомления о (определенных) свойствах (определенных) объектов, которые он фактически наблюдает.Он не получает уведомлений о любых других изменениях.

Если я правильно понимаю ваше описание, наблюдатель наблюдает за свойствами одного конкретного объекта документа.Наблюдатель не наблюдает за свойством currentUser (которое является частью другого объекта).Так что нет, наблюдатель определенно не получит уведомление, если currentUser изменится.

Однако в KVO возможно инициировать уведомление об изменении свойств, на которые влияет изменение другого свойства.Это обычно используется для вычисляемых свойств:

Представьте себе класс Event, который имеет свойство чтения / записи startDate и endDate, и вычисляемое свойство duration, которое вычисляет продолжительность на основе начала идата окончания:

- (NSTimeInterval)duration
{
    return [[self endDate] timeIntervalSinceDate:[self startDate]];
}

Вы должны настроить этот класс так, чтобы он уведомлял наблюдателей о duration, когда кто-то изменяет startDate или endDate:

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
{
    NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];

    if ([key isEqualToString:@"duration"]) {

        keyPaths = [keyPaths setByAddingObjectsFromSet:
            [NSSet setWithObjects:@"startDate", @"endDate", nil]
        ];

    }

    return keyPaths;
}

Это описаноболее подробно в Руководстве по программированию наблюдения значения ключа .

...