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
来设置您的堆栈。
新的容器viewContext
和backgroundContext
自动发送和消费通知,并从PersistentStoreCordinator
合并它们。
这样您就不需要自己管理合并,NSFetchedResultController
上设置的 viewContext
将更新
【讨论】:
以上是关于NSManagedObjectContext 从私有上下文合并,只刷新改变的对象的主要内容,如果未能解决你的问题,请参考以下文章