2017-10-04 48 views
0

我试图延长NSManagedObjectContext并从中实例化一个对象如下:为什么NSManagedObjectContext在扩展时返回null?

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

你在哪里给'managedObjectContext'变量赋值? –

+0

@TomHarrington我没有给它赋值。我必须分配什么价值才能发挥作用? –

回答

1

你有这样一行:

var managedObjectContext: NSManagedObjectContext? 

但是当你在评论提到,你永远不分配一个值。结果它是零。你不能安全地解开它 - 你的guard检查失败,所以你永远不会通过它调用persist电话。没有东西可以打开,但guard意味着你不会崩溃。

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

[您可以通过其他方式创建托管对象上下文,但这些日子很少需要。你不能简单地初始化一个像NSManagedObjectContext()。]