1

事實:的NSManagedObjectContext從私人範圍內合併,只刷新更改的對象

  • 我使用CoreData。
  • 我有父子對象與子行,其中子女可能會超過500個對象。
  • 我在UITableViewControllerUITableView中顯示那些子對象。
  • 我已經將它設置爲與NSFetchedResultsController一起使用,允許我在發生某些變化時立即獲得更新。我需要那個。
  • 我合併來自私人環境的變化與下面的代碼主要方面:

    @objc func privateContextDidSaveNotification(notification: NSNotification) 
    {    
        let savedContext = notification.object as! NSManagedObjectContext 
    
        if savedContext == self.managedObjectContext 
        { 
         return // This is the Main context 
        } 
    
        if savedContext.persistentStoreCoordinator != self.managedObjectContext.persistentStoreCoordinator 
        { 
         return // This is different DB 
        } 
    
        self.managedObjectContext.performBlockAndWait(
        { 
         self.managedObjectContext.mergeChangesFromContextDidSaveNotification(notification) 
         self.managedObjectContext.refreshAllObjects() 
        }) 
    } 
    
  • NSFetchedResultsController.delegate設置僅對子對象。

問題:

如果此父對象的變化,甚至一個子對象,在 func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?)被調用的所有子行,這意味着,它被稱爲> 500次,基本上,應用程序凍結。

我發現了什麼:

  1. 所有孩子的更新通知對象不受此行合併後引起的:self.managedObjectContext.refreshAllObjects()
  2. 如果我刪除該行,然後NSFetchedResultsController不會收到任何通知,根本不需要更新 - 但我需要。

問題:

  1. 我怎樣才能讓這改變子對象的一個​​特定的行,這意味着 - 我怎麼能通知NSFetchedResultsController實際上只改變了行?
  2. 什麼是通知NSFetchedResultsController關於合併對象的典型解決方案?

非常感謝!

馬里斯

回答

0

您現在可以使用NSPersistentContainer設置你的籌碼。 新容器viewContextbackgroundContext會自動發送和使用通知,並將它們從PersistentStoreCordinator合併。

這樣你就不需要管理合並自己和NSFetchedResultController,那將是對viewContext設置將更新