Как я могу отслеживать / наблюдать все изменения внутри подграфа?

StackOverflow https://stackoverflow.com/questions/2463950

Вопрос

У меня есть NSManagedObjectContext, в котором у меня есть несколько подклассов NSManagedObjects, так что некоторые из них являются контейнерами для других.Что я хотел бы сделать, так это наблюдать за объектом верхнего уровня, чтобы получать уведомления о любых изменениях любого из его свойств, ассоциаций или свойств / ассоциаций любого из объектов, которые он содержит.

Использование 'hashchanges' контекста не дает мне достаточной детализации.Метод objects 'isUpdated' применяется только к данному объекту (а не к чему-либо в его ассоциациях).Существует ли удобный (возможно, основанный на KVO) способ, с помощью которого я могу наблюдать изменения в контексте, которые ограничены подграфом?

Это было полезно?

Решение

Вы захотите прислушаться к 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
}

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

Другие советы

вот простой пример в 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)")
        }
    }

для меня это просто потерянные следующие две функции, может быть, это сэкономит часы для кого-то

func controllerWillChangeContent(controller: NSFetchedResultsController) {
    tableView.beginUpdates()
}

func controllerDidChangeContent(controller: NSFetchedResultsController) {
    tableView.endUpdates()
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top