Как я могу обнаружить изменения для определенного атрибута 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. Тем не менее, я все еще остаюсь с проблемой, что уведомление об изменении из слияния в основном потоке не обязательно будет содержать все изменения, сделанные в фоновом потоке.