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.
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.
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()
}
}
}