Как я могу отслеживать/наблюдать за всеми изменениями внутри подграфа?
У меня есть NSManagedObjectContext, в котором у меня есть несколько подклассов NSManagedObjects, так что некоторые из них являются контейнерами для других. То, что я хотел бы сделать, - посмотреть объект верхнего уровня, который будет уведомлен о любых изменениях любого из его свойств, ассоциаций или свойств/ассоциаций любого из содержащихся в нем объектов.
Использование контекста hasChanges не дает мне достаточной детализации. Метод isUpdated объектов применяется только к данному объекту (а не к его объединениям). Есть ли удобный (возможно, KVO-based), я могу наблюдать изменения в контексте, ограниченном подграфом?
Ответы
Ответ 1
Вы хотите прослушать NSManagedObjectContextObjectsDidChangeNotification
, чтобы выбрать все изменения в вашей модели данных. Это можно сделать, используя следующий код:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleDataModelChange:)
name:NSManagedObjectContextObjectsDidChangeNotification
object:myManagedObjectContext];
который вызывает -handleDataModelChange:
при любых изменениях в контексте myManagedObjectContext
.
Ваш метод -handleModelDataChange
: будет выглядеть примерно так:
- (void)handleDataModelChange:(NSNotification *)note
{
NSSet *updatedObjects = [[note userInfo] objectForKey:NSUpdatedObjectsKey];
NSSet *deletedObjects = [[note userInfo] objectForKey:NSDeletedObjectsKey];
NSSet *insertedObjects = [[note userInfo] objectForKey:NSInsertedObjectsKey];
// Do something in response to this
}
Как вы можете видеть, уведомление содержит информацию о том, какие управляемые объекты были обновлены, удалены и вставлены. Из этой информации вы сможете действовать в ответ на изменения модели данных.
Ответ 2
здесь простой пример в Swift:
NotificationCenter.default.addObserver(forName: .NSManagedObjectContextObjectsDidChange, object: nil, queue: nil) { note in
if let updated = note.userInfo?[NSUpdatedObjectsKey] as? Set<NSManagedObject>, updated.count > 0 {
print("updated: \(updated)")
}
if let deleted = note.userInfo?[NSDeletedObjectsKey] as? Set<NSManagedObject>, deleted.count > 0 {
print("deleted: \(deleted)")
}
if let inserted = note.userInfo?[NSInsertedObjectsKey] as? Set<NSManagedObject>, inserted.count > 0 {
print("inserted: \(inserted)")
}
}
Ответ 3
для меня это просто потеряно после двух func, может быть, это сэкономит часы для кого-то
func controllerWillChangeContent(controller: NSFetchedResultsController) {
tableView.beginUpdates()
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
tableView.endUpdates()
}