【问题标题】:NSManagedObjectContext merge from private context, refresh only changed objectsNSManagedObjectContext 从私有上下文合并,只刷新改变的对象
【发布时间】:2016-04-15 07:56:36
【问题描述】:

事实:

  • 我使用 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 将不会收到任何通知,告知其内容已更新 - 但我需要。

问题:

  1. 我怎样才能使某一行发生更改的子对象,意思是 - 我怎样才能通知 NSFetchedResultsController 仅实际更改的行?
  2. 通知 NSFetchedResultsController 合并对象的典型解决方案是什么?

非常感谢!

马里斯

【问题讨论】:

    标签: ios uitableview core-data nsfetchedresultscontroller nsmanagedobjectcontext


    【解决方案1】:

    您现在可以使用NSPersistentContainer来设置您的堆栈。 新的容器viewContextbackgroundContext 自动发送和消费通知,并从PersistentStoreCordinator 合并它们。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多