解包后,CoreDataStack 中的 ManagedObjectContext 返回 nil
ManagedObjectContext within CoreDataStack is returned nil after unwrapping
我正在努力牢牢掌握 Core Data 以及大部分内容,尤其是 child/parent 上下文和获取结果控制器。但是我有点卡在 CoreDataStack 上。我试图在程序的其余部分调用属性 'context'。我可以在我的第一个视图中打印上下文,但它似乎并没有通过导航栏在整个应用程序中持续存在。
这是CoreDataStack.swift
//exablishes the directory to be used for the stack in SQLite fashion
private lazy var applicationDocumentsDirectory: NSURL = {
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
return urls[urls.count-1]
}()
//establishes the managed context by which managed objects interact in reading and writing
lazy var context: NSManagedObjectContext = {
var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = self.psc
return managedObjectContext
}()
//establishes the coordinator that connects the managed context with the persistent store
private lazy var psc: NSPersistentStoreCoordinator = { let coordinator = NSPersistentStoreCoordinator(
managedObjectModel: self.managedObjectModel)
let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent(self.modelName)
do {
let options = [NSMigratePersistentStoresAutomaticallyOption : true]
try coordinator.addPersistentStoreWithType( NSSQLiteStoreType, configuration: nil, URL: url, options: options) //establishes the actual persistent store
} catch {
print("Error adding persistent store.")
}
return coordinator
}()
//establishes the object model that interacts with the GUI object data model
private lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = NSBundle.mainBundle().URLForResource(self.modelName, withExtension: "momd")!
return NSManagedObjectModel(contentsOfURL: modelURL)!
}()
这是AppDelegate.Swift
中的相关部分
let navigationController = window!.rootViewController as! UINavigationController
let listViewController = navigationController.topViewController as! ViewController
listViewController.coreDataStack = coreDataStack
这并不能真正解决您的问题,但我提供了替代解决方案。我没有发现您提供的代码有任何问题。了解您稍后如何尝试在其他视图控制器中获取 CoreDataStack
以及您认为它不持久存在的原因会很有帮助。
我通常让我的 CoreDataStack
class 只是静态方法和变量的集合。
将 lazy
替换为 static
(所有静态变量自动惰性),用于 CoreDataStack
上的所有变量。然后,在你的应用程序中任何你想使用上下文的地方:
let ctx = CoreDataStack.context;
我正在努力牢牢掌握 Core Data 以及大部分内容,尤其是 child/parent 上下文和获取结果控制器。但是我有点卡在 CoreDataStack 上。我试图在程序的其余部分调用属性 'context'。我可以在我的第一个视图中打印上下文,但它似乎并没有通过导航栏在整个应用程序中持续存在。
这是CoreDataStack.swift
//exablishes the directory to be used for the stack in SQLite fashion
private lazy var applicationDocumentsDirectory: NSURL = {
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
return urls[urls.count-1]
}()
//establishes the managed context by which managed objects interact in reading and writing
lazy var context: NSManagedObjectContext = {
var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = self.psc
return managedObjectContext
}()
//establishes the coordinator that connects the managed context with the persistent store
private lazy var psc: NSPersistentStoreCoordinator = { let coordinator = NSPersistentStoreCoordinator(
managedObjectModel: self.managedObjectModel)
let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent(self.modelName)
do {
let options = [NSMigratePersistentStoresAutomaticallyOption : true]
try coordinator.addPersistentStoreWithType( NSSQLiteStoreType, configuration: nil, URL: url, options: options) //establishes the actual persistent store
} catch {
print("Error adding persistent store.")
}
return coordinator
}()
//establishes the object model that interacts with the GUI object data model
private lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = NSBundle.mainBundle().URLForResource(self.modelName, withExtension: "momd")!
return NSManagedObjectModel(contentsOfURL: modelURL)!
}()
这是AppDelegate.Swift
中的相关部分 let navigationController = window!.rootViewController as! UINavigationController
let listViewController = navigationController.topViewController as! ViewController
listViewController.coreDataStack = coreDataStack
这并不能真正解决您的问题,但我提供了替代解决方案。我没有发现您提供的代码有任何问题。了解您稍后如何尝试在其他视图控制器中获取 CoreDataStack
以及您认为它不持久存在的原因会很有帮助。
我通常让我的 CoreDataStack
class 只是静态方法和变量的集合。
将 lazy
替换为 static
(所有静态变量自动惰性),用于 CoreDataStack
上的所有变量。然后,在你的应用程序中任何你想使用上下文的地方:
let ctx = CoreDataStack.context;