CoreDataStack 中的 ManagedObjectContext 在展开后返回 nil

Posted

技术标签:

【中文标题】CoreDataStack 中的 ManagedObjectContext 在展开后返回 nil【英文标题】:ManagedObjectContext within CoreDataStack is returned nil after unwrapping 【发布时间】:2016-04-22 21:59:18 【问题描述】:

我正试图牢牢掌握核心数据,并且在大多数情况下,一切都是从那以后产生的,尤其是在子/父上下文和获取结果控制器方面。但是我有点卡在CoreDataStack上。我试图在程序的其余部分中调用属性“上下文”。我可以在我的第一个视图中打印上下文,但它似乎并没有通过导航栏在整个应用程序中持续存在。

这是 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

【问题讨论】:

【参考方案1】:

这并不能真正解决您的问题,但我提供了另一种解决方案。我认为您提供的代码没有任何问题。了解您稍后如何尝试在其他视图控制器中获取 CoreDataStack 以及您认为它没有持久化的原因会很有帮助。


我通常让我的CoreDataStack 类只是静态方法和变量的集合。

lazy 替换为static(所有静态变量都会自动延迟),用于CoreDataStack 上的所有变量。然后,在您的应用中您想使用上下文的任何地方:

let ctx = CoreDataStack.context;

【讨论】:

我喜欢。简单高效 它也会在我使用“self.___”的情况下引发错误。我是否也应该简单地删除 self 的所有实例? @ggworean 是的! self 现在没有被使用,因为CoreDataStack 中的所有方法和变量都是静态的。它们现在是类变量而不是实例变量。你不再实例化CoreDataStack,而是直接使用它。 我遇到了如何制作 saveContext() 函数的问题。我认为新联系人对象与其子上下文的弱连接导致父上下文正确保存它的问题。 @ggworean 你能在你的问题中添加相关代码吗?

以上是关于CoreDataStack 中的 ManagedObjectContext 在展开后返回 nil的主要内容,如果未能解决你的问题,请参考以下文章

我已将 ViewController 嵌入选项卡栏控制器中,现在我的 coreDataStack.managedContext 失败

在 EditView 中使用 CoreData 中的值预填充 SwiftUI 表单

具有内存存储的核心数据堆栈的单元测试不断失败

删除 NSManagedObjectContext

核心数据实体未删除

Coredata groupby 属性 iOS