说我有一个包含以下实体的应用:Page< - >> BookPosition<< - >书。我的应用程序的工作是使用户能够使用GUI(在主线程上)混合和匹配一本或多本图画书中的页面。
现在,有两点:
BookPositions
会被创建并销毁,但永远不会更改。 假设我使用共享PSC,单独的MOC和防水线程隔离在后台线程上同步一组图画书(一些已经存在,一些是新的)。在开始此过程之前,我确保用户无法修改任何一个待同步的书,直到后台线程上的MOC为该书调用了-[NSManagedObjectContext save:]
,并相应地生成了NSManagedObjectContextDidSaveNotification
,使用mergeChangesFromContextDidSaveNotification
合并在主线程上:。
我很天真,我没想到这种方法会导致合并冲突,因为 - 表面上看 - 在调用mergeChangesFromContextDidSaveNotification:
之前,所有相关实体都没有可能在一个线程上进行更改两个MOC都是最新的。但是,如果用户在主线程上进行了更改,那么合并冲突将发生在后台线程上,该主线程会改变与已同步的图书和待同步图书之间共享的页面相关联的BookPosition集合书。
这里要说的是,在一对多关系的“多”面上更改(添加或删除)实体会导致“一”侧的对象的新版本,即使在“一方”已改变。到目前为止,一切都有意义,我想我可以通过在后台MOC上设置合并策略(NSMergeByPropertyStoreTrumpMergePolicy
或NSMergeByPropertyObjectTrumpMergePolicy
应该在这里工作吗?)来解决问题。不幸的是(并且意外地),在设置合并策略之后,我在主线程上出现了冲突,这正是我为什么感到困惑的原因。
我想知道我的持久存储中的数据在主线程上与我的MOC不同步。是否存在差异是因为背景MOC正在保存/有机会发布NSManagedObjectContextDidSaveNotification
之前?
我似乎也可以通过在主MOC上设置合并策略来解决问题,但如果可能的话,我想知道这里到底发生了什么。