如何将未保存的NSManagedObjectContext更改从一个上下文合并到另一个上下文?

时间:2017-01-06 02:13:19

标签: core-data nsfetchedresultscontroller nsmanagedobject nsmanagedobjectcontext nsfetchrequest

我有两个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中的对象有未保存的更改。

最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

这没有内置机制。如果在一个上下文中有未保存的更改,则这些更改仅存在于该上下文中。其他上下文无法看到它们,因此无法获取它们包含的信息。如果您不想保存更改,则唯一的选择是在其他上下文中再次进行相同的更改。也就是说,无论你在上下文A中做了什么,都要在上下文B中再做一遍,这样它就会有相同的变化。

答案 1 :(得分:0)

使用NSPersistentContainer并在automaticallyMergesChangesFromParent上设置viewContext,您应将其用于获取控制器,然后使用newBackgroundContext进行后台工作。保存背景上下文后,其持久性协调器(也是viewContext的父级)会通知viewContext合并到更改中。

太多的开发人员正在滥用父/子专用队列上下文,而这些上下文从未设计用于后台使用,因此Apple决定采用大锤方法来解决此问题。