Как я могу обнаружить изменения для определенного атрибута NSManagedObject
? В моей модели данных основных данных у меня есть объект Product
, который представляет продукт для продажи. Объект Product
имеет несколько атрибутов: price
, sku
, weight
, numberInStock
и т.д. Всякий раз, когда изменяется атрибут price
для Product
, мне нужно выполнить длительный расчет. Следовательно, я хотел бы знать, когда изменяется атрибут price
любого Product
, [edit], даже если это изменение связано с объединением контекста, сохраненного в другом потоке. Что такое хороший способ сделать это? У меня есть тысячи объектов Product
в моем магазине; очевидно, не представляется возможным отправить каждому сообщение addObserver
.
Я использовал NSManagedObjectContextObjectsDidChangeNotification
для обнаружения изменений, но он только уведомляет меня о том, что управляемый объект изменился, а не какой атрибут этого объекта изменился. Я мог бы повторить вычисление всякий раз, когда есть какое-либо изменение в Product
, но это приводит к бесполезным перерасчетам всякий раз, когда неактуальный атрибут изменился. Я рассматриваю возможность создания объекта price
(который содержит только атрибут price
) и использования отношения "один к одному" между Product
и price
. Таким образом, я могу обнаружить изменения объектов price
, чтобы начать вычисление. Мне кажется, это слишком глупо. Есть ли лучший способ?
Update:
@railwayparade указал, что я могу использовать метод changedValues
NSManagedObject
, чтобы определить, какие свойства изменились для каждого обновленного объекта. Я полностью пропустил этот метод, и это полностью решит мою проблему, если бы изменения не выполнялись в фоновом потоке и не сливались в контексте основного потока. (См. Следующий параграф.)
Я полностью упустил тонкость в отношении того, как работает NSManagedObjectContextObjectsDidChangeNotification
. Насколько я могу судить, когда контекст управляемого объекта, сохраненный в другом потоке, объединяется в контекст основного потока (используя mergeChangesFromContextDidSaveNotification:
), результирующий NSManagedObjectContextObjectsDidChangeNotification
содержит информацию об изменении объектов, которые в настоящее время находятся в главном контекст, управляемый потоком. Если измененный объект не находится в контексте основного потока, он не будет частью уведомления. Это имеет смысл, но я не ожидал этого. Поэтому моя мысль об использовании взаимного отношения вместо атрибута для получения более подробной информации об изменении фактически требует изучения фонового потока NSManagedObjectContextDidSaveNotification
, а не основного потока NSManagedObjectContextObjectsDidChangeNotification
. Разумеется, было бы гораздо разумнее использовать метод changedValues
NSManagedObject
, как объяснил @railwayparade. Тем не менее, я все еще остаюсь с проблемой, что уведомление об изменении из слияния в основном потоке не обязательно будет содержать все изменения, сделанные в фоновом потоке.