2017-08-28 1 views
0

Ich verfolge Apple-Dokumentation für Datenstack Kern [Initialisieren der Core Data-Stack] (https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/InitializingtheCoreDataStack.html)Wie initialisiert man Core Data managedObjectContext mit einer Modellklasse? .

Hier ist mein Code:

import Foundation 
import CoreData 
class Cmodel: NSObject { 
var managedObjectContext: NSManagedObjectContext 

init(completionClosure: @escaping() ->()) { 
    //This resource is the same name as your xcdatamodeld contained in your project 
    guard let modelURL = Bundle.main.url(forResource: "MySampleListView", withExtension:"momd") else { 
     fatalError("Error loading model from bundle") 
    } 
    // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model. 
    guard let mom = NSManagedObjectModel(contentsOf: modelURL) else { 
     fatalError("Error initializing mom from: \(modelURL)") 
    } 

    let psc = NSPersistentStoreCoordinator(managedObjectModel: mom) 

    managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.mainQueueConcurrencyType) 
    managedObjectContext.persistentStoreCoordinator = psc 

    let queue = DispatchQueue.global(qos: DispatchQoS.QoSClass.background) 
    queue.async { 
     guard let docURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last else { 
      fatalError("Unable to resolve document directory") 
     } 
     let storeURL = docURL.appendingPathComponent("DataModel.sqlite") 
     do { 
      try psc.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: storeURL, options: nil) 
      //The callback block is expected to complete the User Interface and therefore should be presented back on the main queue so that the user interface does not need to be concerned with which queue this call is coming from. 
      DispatchQueue.main.sync(execute: completionClosure) 
     } catch { 
      fatalError("Error migrating store: \(error)") 
     } 
    } 
} 
} 

ich das Objekt von AppDelegate Klasse zuzugreifen versuche: -

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    managedOBJ = Cmodel(completionClosure: { 

     DispatchQueue.main.async { 
      self.context = self.managedOBJ?.managedObjectContext 
     } 
    }) 

    saveValues() 
    // Override point for customization after application launch. 
    return true 
}. 

So benutze ich es.

//Save Local DB 
extension AppDelegate { 

    func saveValues() { 
    let testQuestionModel : Kishor = NSEntityDescription.insertNewObject(forEntityName: "Kishor", into: AppDelegate.getContext()) as! Kishor 

    testQuestionModel.name = "Kishor Da Pahalwani" 

    self.saveContext() 
    } 
} 

Ich erhalte einen fatalen Fehler.

Ich weiß nicht den Grund, aber möglicherweise saveValues() wird vor Core Data verwalteten Kontext Objekt Initialisierung aufgerufen. Oder vielleicht initiiere ich falsch.

Ich versuche, Apple Dokumentation zu folgen, aber ich weiß nicht, was ich vermisse. Bitte kann mir jemand vorschlagen?

+0

einfache Demo für Kerndaten Update hinzufügen löschen werfen Sie einen Blick https://github.com/SanjeetVerma/CoreData-CRUD-Operation-Add-Edit-Delete-Search- –

Antwort

0

saveValues heißt außerhalb der completionClosure. Auf diese Weise erhalten Sie einen schwerwiegenden Fehler. Der Core Data-Stack ist nicht bereit.

Können Sie erklären, was Sie erreichen möchten?

+0

Yeah Eigentlich möchte ich Core Data initialisieren und ich will um sie zu speichern und zu aktualisieren und aus meiner Modellklasse zu löschen. Danke – kishor0011

+0

@ kishor0011 auffüllen oder initialisieren? –

+0

In meiner Modellklasse initialisieren. – kishor0011