У меня есть управляемый объект, который действует как список воспроизведения, он имеет отношение ко многим с элементами списка воспроизведения. Может быть несколько плейлистов, но только один «активный» плейлист. Активный список воспроизведения обозначается логическим атрибутом управляемого объекта.
У меня есть количество элементов в активном списке воспроизведения, отображаемое как значок на элементе панели вкладок. Контроллер представления, который представляет элемент панели вкладок, прослушивает определенное уведомление, которое запускается, когда содержимое активного списка воспроизведения обновляется.
Я реализовал это, как мне кажется, неуклюже, и хотел бы сделать это лучше. В данный момент это работает, но я не доволен этим.
В настоящее время каждый объект списка воспроизведения на awakeFromFetch
проверяет, является ли он активным, и, если это так, регистрируется (используя наблюдение значения ключа) в качестве наблюдателя для пути ключа, который является ключом для отношения. Когда он наблюдает изменение, оно запускает уведомление, в результате чего элемент панели вкладок обновляется сам.
Если список воспроизведения теряет или приобретает активный статус, он останавливается или начинает наблюдать себя соответствующим образом, поэтому уведомления запускаются только из активного списка воспроизведения.
Я хотел бы отбросить весь самонаблюдаемый код KVO, поскольку я обеспокоен различными точками входа и выхода, а также тем, когда следует соответствующим образом добавлять и удалять наблюдателей. Это кажется слишком грязным.
Я хотел бы просто переопределить didChangeValueForKey:
, проверить и при необходимости отправить туда уведомление, а затем вызвать супер реализацию. Но это прямо запрещено в документации:
didChangeValueForKey:
Вызывается для информирования получателя об изменении значения данного свойства.
- (void) didChangeValueForKey: (NSString *) ключ
Параметры
ключ
Название свойства, которое изменилось. Обсуждение Подробнее см.
Руководство по программированию наблюдения значения ключа.
Вы не должны переопределять этот метод.
Итак, что я могу сделать?