Это недокументированное, но наблюдаемое поведение как для ОС X, так и для iOS, что сохранение считается изменением для всего NSManagedObject, а не только для разных элементов. Вы можете найти ворчание о различных последствиях этого для привязок и т. Д. Вокруг этого сайта, на openradar.appspot.com и т. Д. То, что проблема также проявляется в явно ложных обстрелах KVO, совершенно неудивительно.
Простой способ справиться с проблемой (ну, простейший после того, как «просто перерисовать все на сохранении», который я нахожу в порядке штрафа, до тех пор, пока кто-то не пожалуется), чтобы прослушивать уведомление об общем уведомлении, а затем вызывать -changedValues на каждом обновленный объект, чтобы выбрать те, которые вам интересны для запуска определенных обновлений.
Если это безнадежно неэффективно для вашего случая использования, вы можете сделать пользовательские аксессоры (сгенерированный множитель - это большая помощь с этим) для ваших свойств, которые собирают флажки редактирования для изменений во всех интересующих вас свойствах; и отправьте это как уведомление после сохранения.
Давайте предположим, что у нас есть a professional sports team app, который постоянно обновляется с помощью каналов JSON, проанализированных в фоновом режиме. Все атрибуты, влияющие на отображение различных команд, игроков, игр и т. Д. У NSManagedObjects есть пользовательские аксессоры, которые устанавливают флаги в структуре {playerStatsChanged, teamStatsChanged, leagueRankingsChanged, yadayadayadaChanged}, в соответствии с тем, какие страницы в приложении будут нуждаться в повторном отображении после текущей выборки -and-parse thread завершается. Затем, как только он будет сохранен, он отключит общее уведомление об обновлении этих экранов с помощью этой структуры установки флага. Вероятно, вы, возможно, объединяете индивидуальные уведомления об изменении пути в какой-то более высокий уровень «обновляете этот экран» в любом случае, верно? Ну, на уровне сеттера свойств это самый низкий накладной пункт, который вы можете сделать для большинства разумных вариантов использования. Конечно, для любого повторяющегося проекта, такого как наши приложения для спортивных команд.
Как вы обрабатываете уведомление? Вы должны смотреть на NSUpdatedObjectsKey словаря пользовательской информации уведомления. – random
Я реализовал этот метод: - (void) observValueForKeyPath: (NSString *) keyPath ofObject: (id) изменение объекта: (NSDictionary *) изменить контекст: (void *) context; – aloo
Теперь я мог бы взглянуть на словарь изменений и посмотреть на старое значение, чтобы увидеть, изменилось ли оно с текущего значения - но почему я получаю уведомление KVO в первую очередь, если nsmanagedobject даже не изменился для данного ключа? – aloo