我有两个NSManagedObjectContext
,一个用于从后台的api响应中写入数据,另一个用于填充NSFetchedResultsController
,如下所示:
// moc used to fetch objects via NSFetchedResultsController:
moc = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
moc.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy
// moc used when writing data from an api response:
backgroundMoc = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
moc.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy
有些对象暂时存储在后台moc中(不调用.save()
),我需要将这些更改合并到主moc,以便我的NSFetchedResultsController
可以访问它。
我尝试订阅NSManagedObjectContextDidSaveNotification
,但只有当我调用backgroundMoc.save()
时才会被击中,我试图避免,因为我的backgroundMoc
中的对象有未保存的更改。
这样做的最佳方法是什么?
这没有内置机制。如果在一个上下文中有未保存的更改,则这些更改仅存在于该上下文中。其他上下文无法看到它们,因此无法获取它们包含的信息。如果您不想保存更改,则唯一的选择是在其他上下文中再次进行相同的更改。也就是说,无论你在上下文A中做了什么,在上下文B中再做一遍,所以它有相同的变化。
使用NSPersistentContainer
并在automaticallyMergesChangesFromParent
上设置viewContext
,您应该将其用于获取控制器,然后使用newBackgroundContext
进行后台工作。当后台上下文保存时,其持久协调器(也是viewContext
的父级)通知合并更改的viewContext
。
太多的开发者滥用父/子私人队列环境,这些环境从未被设计用于后台使用,因此Apple决定采用大锤方法来解决这个问题。