Базовые данные: Наблюдение за новой сущностью определенного типа - PullRequest
4 голосов
/ 02 сентября 2011

Я хотел бы получать уведомления всякий раз, когда объект определенного типа добавляется (и может быть изменен / удален).

Я прочитал, что это возможно, добавив наблюдателя в 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, и это, вероятно, очень просто, но слишком долго гонялся за ответом.Не могу найти примеры и / или объяснения о том, как правильно наблюдать за изменениями для объекта контекста (я смог наблюдать изменения на конкретных объектах без проблем).

Кстати: это аналогичный вопрос, который предлагаетэто возможно, но мне не хватает деталей: Базовые данные: наблюдение за всеми изменениями в сущности определенного типа

Ответы [ 2 ]

9 голосов
/ 02 сентября 2011

Во-первых, не путайте сущности и объекты.Сущности - это абстракции, родственные классам, и они никогда не добавляются и не удаляются из контекста управляемого объекта.Это управляемые объекты, которые добавляются или удаляются из контекста управляемого объекта.Каждый управляемый объект связан с сущностью в модели данных точно так же, как любой другой экземпляр объекта связан с конкретным классом.

Итак, что вы действительно хотите - это получать уведомления, когда управляемый объект, связанный с определенной сущностью, вставляется / обновляется / удаляется.

Самый простой способ справиться с этим - это зарегистрироваться для контекста.:

NSManagedObjectContextObjectsDidChangeNotification

… который будет предоставлять уведомление всякий раз, когда управляемый объект в контексте вставляется / обновляется / удаляется.Чтобы найти только управляемые объекты, связанные с определенной сущностью, проверьте объекты, возвращенные ключами NSInsertedObjectsKey, NSUpdatedObjectsKey и NSDeletedObjectsKey, а затем проверьте свойство entity каждого объекта.

В качестве альтернативы вы используете пользовательский подкласс NSManagedObject и переопределяете awakeFromInsert для выдачи уведомления при первой вставке объекта.

Я бы отметил, что такая функциональность нужна редко.Когда вы обнаруживаете, что подключаете много уведомлений, это обычно , что указывает на необходимость доработки вашей модели данных для сбора дополнительной информации.Обычно вам нужны уведомления, потому что некоторая ключевая логика модели данных не закодирована в Базовых данных, а находится во внешнем объекте, который нуждается в уведомлении.

0 голосов
/ 19 октября 2011

Я выбираю этот подход вместо этого, он чувствует себя чище:

  • Создание на основе сущностей NSArrayController (используйте Интерфейсный Разработчик, чтобы писать меньше кода)
  • Наблюдайте arrangedObjects путь ключа вашего контроллера массива
  • Готово.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...