我有一个托管对象上下文的层次结构,如下所示:
A
/ \
B C
...其中A'父母是持久性商店。 A和C使用专用队列,B使用主队列。我发现这似乎并不重要,但无论如何我都会注意到它。
所以,这是复制问题的最佳方法:
- 上下文B创建一个对象。因为我需要在多个位置引用同一个对象,所以我通过obtainPermanentIDsForObjects获取一个永久对象ID。然后我保存。
- 上下文A继承更改,将其保存到永久存储中。上下文C看到更改通知并合并更改。到目前为止一切都很好
- 我从上下文C中获取对象并更改其中一个属性。然后我保存。上下文A继承更改并将其保存到磁盘。
这是奇怪的地方。上下文B永远不会看到变化。我有一个更改通知,如此拦截:
-(void)contextDidSaveNotification:(NSNotification *)notification
{
NSManagedObjectContext *context = [notification object];
if(context!=_moc.parentContext)
return;
NSLog(@"Context %@ did save, merging into %@, info:\n%@", context, _moc, [notification userInfo]);
[_moc mergeChangesFromContextDidSaveNotification:notification];
}
我看到变化结束了,看到它合并到了上下文B中。但是我在第一步中创建的对象从未看到任何变化。
我已将这一切追溯到一个非常具体的事情。如果我在第一步中没有在对象上获得永久对象ID,则更改会在上下文B中合并回原始对象。但这让我没有可靠的对象ID在其他环境中使用(据我所知)。
这似乎可能是一个错误。我希望不是。但由于某些原因,当我获得永久对象ID时,它会阻止更改从其他上下文合并回来。
还有其他人看过这种行为吗?任何解决方案?
(我知道来自上下文C的更改正在进入A,而A正在将它们保存到磁盘。如果我重新启动应用程序,那么更改就是来自磁盘。)