我正在尝试扩展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
之前打印行时,它会打印但不会打印。它不会返回任何错误,因为它是安全解包但不起作用。
答案 0 :(得分:1)
你有这一行:
var managedObjectContext: NSManagedObjectContext?
但正如您在评论中提到的那样,您永远不会分配值。结果是零。您无法安全地展开它 - 您的guard
检查失败,因此您永远不会将其转到persist
来电。没有什么要解开的,但是guard
意味着你不会崩溃。
创建托管对象上下文取决于您的应用程序的设置方式以及此代码执行的位置/时间。在最新版本的iOS中,您通常使用NSPersistentContainer
来设置Core Data。它具有viewContext
属性,可用于与UI相关的代码,也可以为服务器通信或其他后台工作创建背景上下文。您可能想要其中一个,但哪个取决于您在何时/何时调用此代码。
[您可以通过其他方式创建托管对象上下文,但这些天需要这样做是不寻常的。您不能只需将其初始化为NSManagedObjectContext()
。