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?

Était-ce utile?

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()
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top