Базовые данные: Наблюдение за новой сущностью определенного типа
Я хотел бы получать уведомления всякий раз, когда объект определенного типа добавляется (и может быть изменен / удален).
Я прочитал, что это возможно, добавив наблюдателя в managedObjectContext. Однако я не нашел реального способа сделать это.
Я делаю:
[context addObserver:self forKeyPath:@"{myEntityName}" options:{I have tried several different values, but I am failing to understand which one to use} context:@"NewEntity"];
Спасибо за помощь.
Примечание: я, очевидно, новичок в coredata / cocoa / target-c, и это, вероятно, очень просто, но слишком долго гонялся за ответом. Не могу найти примеры и / или объяснения о том, как правильно наблюдать за изменениями для объекта контекста (я смог наблюдать изменения на конкретных объектах без проблем).
КСТАТИ: это аналогичный вопрос, который предполагает, что это возможно, но мне не хватает деталей: Основные данные: Наблюдение за всеми изменениями на Entity определенного типа
2 ответа
Во-первых, не путайте сущности и объекты. Сущности - это абстракции, родственные классам, и они никогда не добавляются и не удаляются из контекста управляемого объекта. Это управляемые объекты, которые добавляются или удаляются из контекста управляемого объекта. Каждый управляемый объект связан с сущностью в модели данных точно так же, как любой другой экземпляр объекта связан с конкретным классом.
Итак, что вы действительно хотите - это получать уведомления, когда управляемый объект, связанный с конкретным объектом, вставляется / обновляется / удаляется.
Самый простой способ справиться с этим - зарегистрироваться для контекста:
NSManagedObjectContextObjectsDidChangeNotification
… Который будет предоставлять уведомление всякий раз, когда управляемый объект в контексте вставляется / обновляется / удаляется. Чтобы найти только управляемые объекты, связанные с определенной сущностью, проверьте объекты, возвращенные ключами NSInsertedObjectsKey, NSUpdatedObjectsKey и NSDeletedObjectsKey, а затем проверьте entity
свойство каждого объекта.
В качестве альтернативы вы используете пользовательский подкласс NSManagedObject и переопределяете awakeFromInsert
выдать уведомление при первой вставке объекта.
Отмечу, что такой функционал нужен редко. Когда вы обнаруживаете, что подключаете много уведомлений, это, как правило, указывает на необходимость доработки вашей модели данных для сбора дополнительной информации. Обычно вам нужны уведомления, потому что некоторая ключевая логика модели данных не закодирована в Базовых данных, а находится во внешнем объекте, который нуждается в уведомлении.
Я выбираю этот подход вместо этого, он чувствует себя чище:
- Создать на основе сущности
NSArrayController
(используйте Interface Builder, чтобы писать меньше кода) - соблюдать
arrangedObjects
ключевой путь вашего контроллера массива - Готово.