Альтернатива переопределению didChangeValueForKey: в NSManagedObject - PullRequest
4 голосов
/ 09 марта 2012

У меня есть управляемый объект, который действует как список воспроизведения, он имеет отношение ко многим с элементами списка воспроизведения. Может быть несколько плейлистов, но только один «активный» плейлист. Активный список воспроизведения обозначается логическим атрибутом управляемого объекта.

У меня есть количество элементов в активном списке воспроизведения, отображаемое как значок на элементе панели вкладок. Контроллер представления, который представляет элемент панели вкладок, прослушивает определенное уведомление, которое запускается, когда содержимое активного списка воспроизведения обновляется.

Я реализовал это, как мне кажется, неуклюже, и хотел бы сделать это лучше. В данный момент это работает, но я не доволен этим.

В настоящее время каждый объект списка воспроизведения на awakeFromFetch проверяет, является ли он активным, и, если это так, регистрируется (используя наблюдение значения ключа) в качестве наблюдателя для пути ключа, который является ключом для отношения. Когда он наблюдает изменение, оно запускает уведомление, в результате чего элемент панели вкладок обновляется сам.

Если список воспроизведения теряет или приобретает активный статус, он останавливается или начинает наблюдать себя соответствующим образом, поэтому уведомления запускаются только из активного списка воспроизведения.

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

Я хотел бы просто переопределить didChangeValueForKey:, проверить и при необходимости отправить туда уведомление, а затем вызвать супер реализацию. Но это прямо запрещено в документации:

didChangeValueForKey:

Вызывается для информирования получателя об изменении значения данного свойства.

- (void) didChangeValueForKey: (NSString *) ключ

Параметры

ключ

Название свойства, которое изменилось. Обсуждение Подробнее см. Руководство по программированию наблюдения значения ключа.

Вы не должны переопределять этот метод.

Итак, что я могу сделать?

Ответы [ 3 ]

1 голос
/ 15 сентября 2016

Я только что прочитал ту же документацию, но если вы посмотрите на верхнюю часть документации NSManagedObject, на самом деле там написано: "Вы сильно обескуражены ..."детали вашей реализации.Например, я делаю следующее для модели данных, которую я могу изменить локально и синхронизировать с сервером:

- (void)didChangeValueForKey:(NSString *)key
{
    [super didChangeValueForKey:key];  // MUST CALL THIS!

    if ([key isEqualToString:NSStringFromSelector(@selector(name))] ||
        [key isEqualToString:NSStringFromSelector(@selector(text))] ||
        [key isEqualToString:NSStringFromSelector(@selector(filename))]
        )
    {
        self.lastModified = [NSDate date];
    }
}

Я не уверен, почему это будет считаться плохим.Он просто говорит: «Делай то, что ты обычно делаешь. Кроме того, я хотел бы установить другое свойство, которое зависит от этого изменения».

0 голосов
/ 28 марта 2012

Я решил это, сделав наблюдателем отдельный объект (единственный объект, который я использую для управления стеком основных данных).Вся сложность самонаблюдения исчезла, и мне не нужно беспокоиться о добавлении или удалении наблюдателей в awakeFromFetch и так далее.

0 голосов
/ 09 марта 2012

То, что вы хотите, это наблюдение значения ключа. Вы должны иметь возможность зарегистрироваться для этого конкретного ключа и получать уведомления при его изменении. Проверьте это тоже: Использование KVO для наблюдения за изменениями свойства объекта в коллекции в Objective-C

...