如何使用模型类初始化Core Data managedObjectContext?

时间:2017-08-28 12:39:01

标签: ios swift core-data

我正在关注核心数据堆栈的Apple文档,尤其是Initializing the Core Data Stack

这是我的代码:

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)")
        }
    }
}
}

我正在尝试从Appdelegate类访问该对象: -

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

这就是我使用它的方式。

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

我的致命错误。

我不知道原因,但可能会在Core Data托管上下文对象初始化之前调用saveValues()?或者我可能以错误的方式进行初始化?

我正在尝试关注Apple文档,但我不知道自己错过了什么。

1 个答案:

答案 0 :(得分:0)

saveValues之外调用

completionClosure。这是你收到致命错误的方式。核心数据堆栈尚未就绪。

你能解释一下你想要达到的目标吗?