KVO с NSPrivateQueueConcurrencyType

Я хотел бы определить, изменился ли атрибут в основных данных, и обновить мой пользовательский интерфейс. Атрибут может измениться в результате фоновой выборки, запущенной в контексте управляемого объекта типа NSPrivateQueueConcurrencyType.

Я добавил прослушиватель: [myCoreDataEntity addObserver:self forKeyPath:myCoreDataAttribute, параметры:NSKeyValueObservingOptionNew context:nil]

Но событие никогда не срабатывает. Есть идеи почему? Объект изменяется в другом контексте - может ли это быть причиной? (Когда сохранение: выполняется в родительском контексте, ничего не срабатывает).

Я могу использовать KVO вручную, но поскольку объект еще не был сохранен в родительском контексте, обновление пользовательского интерфейса не работает, поскольку он указывает на контекст в NSMainQueueConcurrencyType, когда объект был изменен в контексте, связанном с NSPrivateQueueConcurrencyType

2 ответа

Решение

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

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

При условии, что myCoreDataEntity в вашем примере это управляемый объект, проблема в том, что автоматические внешние уведомления об изменениях [отключены Базовыми данными для управляемых объектов] для смоделированных свойств 1:

NSManagedObject отключает автоматические уведомления об изменении значения ключа (KVO) для смоделированных свойств, а примитивные методы доступа не вызывают методы доступа и уведомления об изменениях. Для немоделированных свойств в OS X v10.4 Core Data также отключает автоматический KVO; на OS X v10.5 и позже, Core Data адаптируется к поведению NSObject.

Вы можете включить их для определенных свойств или для всех свойств в подклассе управляемого объекта или в категории на подклассе управляемого объекта:

Одно свойство:

- (BOOL) automaticallyNotifiesObserversFoMyCoreDataAttribute {
    return YES;
}

Все свойства (не рекомендуется):

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey {
    return YES;
}

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

Другие вопросы по тегам