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?
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."
La fusion automatique des modifications du parent doit être définie sur le viewContext comme suit:
persistentContainer.viewContext.automaticallyMergesChangesFromParent = true
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
.