Основные данные: наблюдение за новой сущностью определенного типа

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

Я читал, что это возможно, добавив наблюдателя в manageObjectContext. Тем не менее, я не нашел реального способа сделать это.

Я делаю:

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

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


person rufo    schedule 01.09.2011    source источник


Ответы (2)


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

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

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

NSManagedObjectContextObjectsDidChangeNotification

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

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

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

person TechZen    schedule 01.09.2011
comment
Спасибо! Это сработало. Для тех, кто ищет конкретный код: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector({some method}) name:NSManagedObjectContextObjectsDidChangeNotification object:context]; - person rufo; 02.09.2011

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

  • Создайте NSArrayController на основе сущностей (используйте Interface Builder, чтобы писать меньше кода)
  • Соблюдайте путь ключа arrangedObjects вашего контроллера массива
  • Готово.
person Vojto    schedule 19.10.2011