2017-10-04 50 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()。]