J'essaie de me faire une idée de NSManagedObjectContext pour Core Data. Xcode 10.1 fournit une bonne quantité de texte passe-partout si la case Core Data est cochée lors de la création d'un nouveau projet. Mais je trouve que c'est un peu confus en ce qui concerne la façon dont le contexte actuel est défini pour chaque contrôleur de vue. Je pense avoir trouvé une meilleure solution et je cherche des conseils pour confirmer ou me remettre sur la bonne voie.
Par exemple, dans le code passe-partout de l'AppDelegate, didFinishLaunchingWithOptions fournit le contexte au MasterViewController comme ceci :
let masterNavigationController = splitViewController.viewControllers[0] as! UINavigationController
let controller = masterNavigationController.topViewController as! MasterViewController
controller.managedObjectContext = self.persistentContainer.viewContex
Dans le MasterViewContoller, la première utilisation du contexte le récupère du fetchedResultsController ET il y a un code pour sauvegarder le contexte fourni, même si l'AppDelegate a déjà une fonction saveContext() disponible pour faire la même chose :
@objc
func insertNewObject(_ sender: Any) {
let context = self.fetchedResultsController.managedObjectContext
let newEvent = Event(context: context)
// If appropriate, configure the new managed object.
newEvent.timestamp = Date()
// Save the context.
do {
try context.save()
} catch {
// Replace this implementation with code to handle the error appropriately.
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
Dans mon application avec plusieurs contrôleurs de vue, j'ai fait des erreurs en essayant de redéclarer ou de transférer le contexte dans chacun d'entre eux lorsqu'il était nécessaire, et j'ai dû faire face à des erreurs causées par le fait d'avoir par inadvertance plus d'un contexte en circulation.
Donc ma question est la suivante : Est-ce que je fais une erreur, ou y a-t-il un inconvénient à l'approche suivante :
1) Faites de l'AppDelegate un singleton :
class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate {
var window: UIWindow?
static let shared = AppDelegate()
…
2) Dans chaque classe où il est nécessaire, définissez toujours le contexte (je suppose que je n'en ai besoin que d'un seul) comme ceci :
let context = AppDelegate.shared.persistentContainer.viewContext
3) Chaque fois que le contexte doit être sauvegardé, faites-le comme ceci :
AppDelegate.shared.saveContext()
Cela semble beaucoup plus simple, plus clair et moins sujet à des erreurs, et semble fonctionner dans ma mise en œuvre. Y a-t-il des problèmes que je ne vois pas ?