NSManagedObjectContext从私有上下文合并,仅刷新更改的对象

时间:2016-04-15 07:56:37

标签: ios uitableview core-data nsfetchedresultscontroller nsmanagedobjectcontext

事实:

  • 我使用的是CoreData。
  • 我的父对象有子行,其中子对象可能超过500个对象。
  • 我在UITableViewController UITableView中显示了这些子对象。
  • 我已将其设置为与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不会收到任何更新内容的通知 - 但我需要这样做。
  3. 问题:

    1. 如何创建一个更改的子对象的特定行,这意味着 - 如何通知NSFetchedResultsController仅实际更改的行?
    2. 通知NSFetchedResultsController关于合并对象的典型解决方案是什么?
    3. 非常感谢!

      Maris的

1 个答案:

答案 0 :(得分:0)

您现在可以使用NSPersistentContainer来设置堆栈。 新容器viewContextbackgroundContext会自动发送和使用通知,并将其与PersistentStoreCordinator合并。

这样您就不需要自己管理合并,而NSFetchedResultController上设置的viewContext会更新