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