web-dev-qa-db-fra.com

managedObjectContext dans Swift 3

Je veux travailler sur cet exemple de code dans lequel Swift et CoreData est utilisé pour créer une table. Cependant, en utilisant Swift 3 Je n'arrive pas à le faire fonctionner. Plus important encore, je ne peux pas remplacer correctement la ligne

// set up the NSManagedObjectContext
  let appDelegate = NSApplication.sharedApplication().delegate as! AppDelegate
  managedContext = appDelegate.managedObjectContext

même si j'ai trouvé cette question connexe (qui n'est cependant pas iOS OS X). Comment puis-je remplacer ce morceau de code qui génère le message d'erreur Value of type 'AppDelegate' has no member 'managedContext'?

12
DaPhil

Swift 3 sous macOS

let appDelegate = NSApplication.shared().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext

L'erreur que vous avez indiquée indique 'AppDelegate' has no member 'managedContext' au lieu de 'AppDelegate' has no member 'managedObjectContext', ce qui m'amènerait à supposer qu'il vous suffit de corriger votre syntaxe.

Swift 3 dans iOS 10

Core Data a besoin d'au moins 3 choses pour fonctionner:

  1. Un modèle d'objet géré
  2. Un coordinateur de magasin persistant
  3. Et un contexte d'objet géré

Mettez ces trois choses ensemble et vous obtenez la pile de données de base.

Lorsque iOS 10 est sorti, un nouvel objet a été introduit appelé NSPersistentContainer qui encapsule la pile de données principale.

Comment créer l'objet conteneur est répondu ici .

managedObjectContext est maintenant une propriété appelée viewContext, accessible via:

let delegate = UIApplication.shared.delegate as! AppDelegate
let managedObjectContext = delegate.persistentContainer.viewContext

Un article utile est Quoi de neuf dans les données de base , mais si cette lecture semble un peu trop lourde, cette vidéo WWDC fait un excellent travail pour expliquer ce sujet.

17
darksinge

AppDelegate a seulement des membres ci-dessous

// MARK: - Core Data stack

lazy var persistentContainer: NSPersistentContainer = {
    /*
     The persistent container for the application. This implementation
     creates and returns a container, having loaded the store for the
     application to it. This property is optional since there are legitimate
     error conditions that could cause the creation of the store to fail.
    */
    let container = NSPersistentContainer(name: "")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            // 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.

            /*
             Typical reasons for an error here include:
             * The parent directory does not exist, cannot be created, or disallows writing.
             * The persistent store is not accessible, due to permissions or data protection when the device is locked.
             * The device is out of space.
             * The store could not be migrated to the current model version.
             Check the error message to determine what the actual problem was.
             */
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()

alors utilisez

 let managedContext = (UIApplication.shared.delegate as! appDelegate).persistentContainer.viewContext

Cela fonctionnera bien

8
Ramanaraynan

Pour macOS et Swift 3.1

let moc: NSManagedObjectContext = (NSApplication.shared().delegate as! AppDelegate).persistentContainer.viewContext
5
Pedro Luz

I Swift 3 vous pouvez obtenir managedContext défini par ce code:

  let managedContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
3
Banker Mittal