Perfect KVO здесь состоит из двух частей: правильно добавить наблюдателя и правильно удалить наблюдатель.
История:
- Я использую одну UITableViewCell (ячейку) для отображения одного NSManagedObject (объекта).
- Каждый объект имеет некоторые динамические свойства, которые необходимо отслеживать его ячейкой.
Не все объекты имеют одинаковый набор наблюдаемых свойств. Я добавляю наблюдателей ключевого пути выборочно следующим образом:
if (object.thumbnail_pic_url) [объект addObserver: ячейка forKeyPath: @ параметры «thumbnail_picture»: 0 context: NULL];
Объект может быть удален. Я должен удалить наблюдателей при удалении объекта. База данных очень большая и сложная, поэтому я определенно не хочу регистрировать все ячейки для получения moc-уведомлений, таких как NSManagedObjectContextObjectsDidChangeNotification. Но я могу согласиться на добавление ivar ячейки в объект, если мне нужно, даже если это опять же хороший шаблон проектирования Modle-View-Controller.
Проблема: как правильно удалить наблюдателя (ячейку) для всех зарегистрированных путей ключа из объекта, когда он удален?
По сути, это большая проблема, которую можно разделить на две небольшие проблемы:
- Где лучше всего разместить код удаления наблюдателя?
Как определить, какие ключевые пути нужно отменить? Я не могу запросить его свойства после удаления объекта - это вызовет невыполнимые сбои, поэтому я не могу писать такой код:
if (object.thumbnail_pic_url) [объект removeObserver: ячейка forKeyPath: @ "thumbnail_picture"];
и я не могу слепо удалить наблюдателя для незарегистрированного ключевого пути - будут выброшены исключения (Невозможно удалить наблюдателя для ключевого пути "thumbnail_picture", потому что он не зарегистрирован как наблюдатель.).