web-dev-qa-db-fra.com

Core Data iOS10: viewContext ne reçoit pas de mises à jour de newBackgroundContext () avec NSFetchResultController

Dans mon application, j'ai une NSFetchResultController pour charger des objets Core Data dans un UITableView . La demande d'extraction associée à ce CRF utilise la nouvelle propriété viewContext disponible pour la NSPersistentContainer (iOS10).

Lorsque je sélectionne une cellule, je passe l'objet Core Data à un nouveau ViewController. Ce nouveau VC utilise toujours le viewContext . À partir de ce ViewController, je peux mettre à jour l'objet Core Data à partir de ViewControllers présenté de manière modale. Pour ce faire, j'utilise newBackgroundContext() pour les ViewControllers modaux. Je peux enregistrer l'objet de mise à jour Core Data sans aucun problème.

Le problème est que le code FRC n'est pas automatiquement mis à jour avec l'objet de mise à jour Core Data à partir du contexte d'arrière-plan . C'est comme si le viewContext n'était pas en train de recevoir et de gérer les mises à jour de l'objet Core Data.

Si je règle automaticallyMergesChangesFromParent sur true pour le viewContext (application large), le CRF récupère l'objet Core Data mis à jour lorsque j'enregistre le contexte d'arrière-plan. De ma compréhension, le viewContext devrait gérer la fusion des données automatiquement. La documentation décrit le viewContext avec: "Ce contexte est configuré pour être générationnel et pour utiliser automatiquement les notifications de sauvegarde d'autres contextes."

Pouvez-vous préciser comment gérer les différents contextes avec un NSFetchResultController?

23
alpennec

Vous voyez le bon comportement. Si vous souhaitez que votre viewContext prenne automatiquement en compte les modifications provenant d'autres contextes, y compris ceux créés par newBackgroundContext(), vous devez définir automaticallyMergesChangesFromParent sur true.

Je conviens que les documents sont déroutants sur ce point, "... et d'utiliser automatiquement les notifications de sauvegarde provenant d'autres contextes."

29
Jerry

La fusion automatique des modifications du parent doit être définie sur le viewContext comme suit:

persistentContainer.viewContext.automaticallyMergesChangesFromParent = true
8
Ramis

Pas travaillé pour moi, alors j'ai changé de bloc de sauvegarde de

self.persistentContainer.performBackgroundTask { (context) ... }

à

self.persistentContainer.newBackgroundContext().performAndWait { ... }

et de définir la valeur true automaticallyMergesChangesFromParent pour que la fusion automatique fonctionne.

lazy var viewContext: NSManagedObjectContext = {
    self.persistentContainer.viewContext.automaticallyMergesChangesFromParent = true
    self.presistentContainer.viewContext.mergePolicy = NSMergePolicy.mergeByPropertyObjectTrump
    return self.persistentContainer.viewContext
}()

Je ne sais pas pourquoi la context de performBackgroundTask n'est pas fusionnée avec viewContext.

0
Vahid