Comment puis-je suivre / observer tous les changements dans un sous-graphe?
-
20-09-2019 - |
Question
J'ai un NSManagedObjectContext dans lequel j'ai un certain nombre de sous-classes de NSManagedObjects telles que certains sont des conteneurs pour les autres. Ce que je voudrais faire est de regarder un objet de niveau supérieur pour être informé de tout changement à l'une de ses propriétés, associations, ou les propriétés / associations de l'un des objets qu'il contient.
Utilisation « de hasChanges » ne me donne pas assez granularité du contexte. La méthode des objets de isUpdated 'applique uniquement à l'objet donné (et non quoi que ce soit dans ses associations). Y at-il une pratique (peut-être, en fonction KVO-) était que je peux observer les changements dans un contexte qui se limitent à un sous-graphe?
La solution
Vous voulez écouter le NSManagedObjectContextObjectsDidChangeNotification
pour ramasser toutes les modifications apportées à votre modèle de données. Cela peut être fait en utilisant le code comme suit:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleDataModelChange:)
name:NSManagedObjectContextObjectsDidChangeNotification
object:myManagedObjectContext];
qui déclenchera -handleDataModelChange:
sur toute modification du contexte myManagedObjectContext
.
Votre -handleModelDataChange
: méthode ressemblerait à quelque chose comme ceci:
- (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
}
Comme vous pouvez le voir, la notification contient des informations sur lesquelles ont été gérées objets mis à jour, supprimés et insérés. A partir de cette information, vous devriez être en mesure d'agir en réponse à vos changements de modèle de données.
Autres conseils
Voici un exemple simple 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)")
}
}
pour moi il est juste perdu suite à deux Func, peut-être cette heure pour sauver quelqu'un
func controllerWillChangeContent(controller: NSFetchedResultsController) {
tableView.beginUpdates()
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
tableView.endUpdates()
}