2017-05-30 3 views
1

Ich habe oft Schnipsel wie der folgende Code gefunden, in dem eine NSPersistentContainer in einem Abschluss initialisiert und einer Variablen zugewiesen wird.Problem mit einem Abschluss-Handler innerhalb einer Schließung aufgerufen

Allerdings denke ich nicht, dass dieser Code optimal ist, da der Completion-Handler der Funktion loadPersistentStores nicht synchron mit dem Rest des Codes ausgeführt wird.

Das bedeutet, dass die storeDescription nicht direkt nach dem Erstellen des Containers in der nächsten Codezeile verfügbar sein konnte. Richtig? Wenn ja, was könnte eine elegante Lösung sein?

lazy var persistentContainer: NSPersistentContainer = { 
    let container = NSPersistentContainer(name: "Test") 
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in 
     if let error = error as NSError? { 
      fatalError("Unresolved error \(error), \(error.userInfo)") 
     } 
    }) 
    return container 
}() 

Antwort

0
  1. nicht faul instantiate die persistentContainer aber früher tun es einfach.
  2. Fügen Sie die abhängige Codezeile auch in den Beendigungshandler ein.
  3. Etwas mit einem Store-is-ready-bool, die ich persönlich nicht mag.
  4. Lassen Sie es wie es ist, wenn es keine Probleme erzeugt.
+0

Ich sehe. Ich habe eine Frage zu Punkt 3: Wenn Sie diese Lösung nicht persönlich mögen, warum schlagen Sie sie vor? :) Gibt es etwas besseres? (Ich mag es auch nicht) – aneuryzm

+0

Es ist eine sehr einfache Lösung und es ist unfair, es nicht zu empfehlen, weil eine "elegante Lösung" nur Vorliebe ist. Ich habe die CoreData-Vorlage ein paar Mal benutzt und bin nie auf ein Problem mit dem langsam instanziierten persistantContainer gestoßen, ich würde vorschlagen, es einfach so zu belassen, wenn es kein Problem ist. – Simon

Verwandte Themen