为什么NSManagedObjectContext在扩展时返回null?

时间:2017-10-04 18:44:41

标签: swift core-data

我正在尝试扩展NSManagedObjectContext并从中实例化一个对象,如下所示:

extension NSManagedObjectContext {
    func persist(block: @escaping ()->Void) {
        perform {
            block()

            do {
                try self.save()
            } catch {
                self.rollback()
            }
        }
    }
}

在控制器中:

var managedObjectContext: NSManagedObjectContext?
func saveFamilyMember(withName name: String) {
    guard let moc = managedObjectContext
        else { return }

    moc.persist {
        let familyMember = FamilyMember(context: moc)
        familyMember.name = name
        print("xxxxxxxx")
    }
}

当我在guard let moc之前打印行时,它会打印但不会打印。它不会返回任何错误,因为它是安全解包但不起作用。

1 个答案:

答案 0 :(得分:1)

你有这一行:

var managedObjectContext: NSManagedObjectContext?

但正如您在评论中提到的那样,您永远不会分配值。结果是零。您无法安全地展开它 - 您的guard检查失败,因此您永远不会将其转到persist来电。没有什么要解开的,但是guard意味着你不会崩溃。

创建托管对象上下文取决于您的应用程序的设置方式以及此代码执行的位置/时间。在最新版本的iOS中,您通常使用NSPersistentContainer来设置Core Data。它具有viewContext属性,可用于与UI相关的代码,也可以为服务器通信或其他后台工作创建背景上下文。您可能想要其中一个,但哪个取决于您在何时/何时调用此代码。

[您可以通过其他方式创建托管对象上下文,但这些天需要这样做是不寻常的。您不能只需将其初始化为NSManagedObjectContext()