web-dev-qa-db-fra.com

NSManagedObjectContext (): `init ()` a été déconseillé dans iOS 9.0: utilisez -initWithConcurrencyType

Je travaillais sur Core Data Stack in Swift - Demystified mais quand je suis arrivé à la ligne

self.context = NSManagedObjectContext()

J'ai eu l'avertissement

`init()` was deprecated in iOS 9.0: Use -initWithConcurrencyType: instead

Je constate que je peux effectuer l'une des opérations suivantes pour self.context =

NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.ConfinementConcurrencyType)
NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)
NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)

mais comme ConfinementConcurrencyType est également obsolète maintenant, cela me laisse MainQueueConcurrencyType et PrivateQueueConcurrencyType. Quelle est la différence entre ces deux et comment dois-je choisir lequel utiliser? J'ai lu cette documentation , mais je n'ai pas vraiment compris.

25
Suragch

Vous aurez essentiellement au moins 1 contexte avec NSMainQueueConcurrencyType et plusieurs contextes avec NSPrivateQueueConcurrencyType. NSPrivateQueueConcurrencyType est généralement utilisé pour enregistrer ou récupérer des éléments dans les données de base en arrière-plan (comme si vous tentiez de synchroniser des enregistrements avec un service Web).

NSMainQueueConcurrencyType crée un contexte associé à la file d'attente principale qui est parfait pour une utilisation avec NSFetchedResultsController.

La pile de données de base par défaut utilise un seul contexte avec NSMainQueueConcurrencyType, mais vous pouvez créer une bien meilleure application en exploitant plusieurs NSPrivateQueueConcurrencyType pour effectuer tout travail qui n'affecte pas l'interface utilisateur.

27
DBoyer

Remplacez ces deux fonctions par la suivante:

lazy var managedObjectContext: NSManagedObjectContext = {
    // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
    let coordinator = self.persistentStoreCoordinator
    var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
    managedObjectContext.persistentStoreCoordinator = coordinator
    return managedObjectContext
    }()

// MARK: - Core Data Saving support

func saveContext () {
    if managedObjectContext.hasChanges {
        do {
            try managedObjectContext.save()
        } catch {
            // Replace this implementation with code to handle the error appropriately.
            // abort() 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
            NSLog("Unresolved error \(nserror), \(nserror.userInfo)")
            abort()
        }
    }
}
7
Hong Yean Chua