2016-01-21 69 views
4

我有一個NSFetchedResultsController我設置如下:NSFetchedResultsController總是包括臨時對象

 let fetchRequest = NSFetchRequest(entityName: "Order") 
     fetchRequest.includesPendingChanges = false 
     fetchRequest.sortDescriptors = [ 
      NSSortDescriptor(key: "status", ascending: false), 
      NSSortDescriptor(key: "date", ascending: false)] 

     self.fetchedResultsController = NSFetchedResultsController(
      fetchRequest: fetchRequest, 
      managedObjectContext: DataStoreManager.sharedInstance.mainContext, 
      sectionNameKeyPath: "section", 
      cacheName: nil) 

     do { 
      try self.fetchedResultsController.performFetch() 

     } catch let error as NSError { 
      print(error) 
     } 

問題是即使有includesPendingChanges設置爲false,它劇照每次我在創建新對象時調用controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?)上下文(不保存)。

有什麼我應該尋找以避免這種情況?

+0

有趣。如果直接執行獲取請求而不是將其傳遞給FRC會發生什麼?你還會獲取未保存的對象嗎?解決方法是在單獨的子上下文中創建新對象,並在您準備好之前不保存到mainContext。 –

+0

跟蹤更改 - 這正是FRC的要點。我想它只是忽略'includesPendingChanges'。如果你不需要這些改變 - 只需執行一次抓取,你就會得到一個不錯的「NSArray」。 – bteapot

回答

5

推薦的方法是使用子上下文。父級應該是在抓取結果控制器中使用的主線程管理對象上下文。

如果保存,則會立即將這些更改「推送」到主要上下文中,即提取的結果控制器。 (保存主要上下文以堅持持久存儲。)

如果您不想保存,只需放棄子保存而不保存。獲取的結果控制器永遠不會知道它。

+0

是的。但OP正確使用'includesPendingChanges',AFAICT。我無法找到NSFRC在其提取請求上忽略該設置的文檔。 –

+0

Docs說'includesPendingChanges'適用於'NSFetchRequest'。 OP指的是'NSFetchedResultsControllerDelegate'回調。 – Mundi

+0

你說當我創建一個新的對象的時候這樣做,對吧?我實際上一直在試圖爲我創建的每個對象做這樣的事情(使用子上下文),但是當我有強制關係時我總是遇到問題,但是在保存之前無法創建關係,因爲對象是在不同的情況下。 – dccarmo