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

Posted

技术标签:

【中文标题】NSManagedObjectContext 从私有上下文合并,只刷新改变的对象【英文标题】:NSManagedObjectContext merge from private context, refresh only changed objects 【发布时间】: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 次,基本上,应用程序会冻结。

我的发现:

    合并后所有子对象的更新通知是由以下行引起的:self.managedObjectContext.refreshAllObjects()。 如果我删除该行,那么 NSFetchedResultsController 将不会收到任何通知,告知其内容已更新 - 但我需要。

问题:

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

非常感谢!

马里斯

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于NSManagedObjectContext 从私有上下文合并,只刷新改变的对象的主要内容,如果未能解决你的问题,请参考以下文章

sh 从私钥生成rsa公钥

Javascript:从私钥生成 ECDSA 公钥

从私钥生成的公钥在 2 种情况下不同

PHP:从私钥字符串/文件中获取 RSA 公钥

从私钥生成CSR的OpenSSL错误

解决从私库下载下来已经编译好的项目核心部分,改变其编译后的静态资源后无法打包进改变部分的问题