因此,在一个应用程序中,我们有两个NSManagedObjectContext,我们称它们为context1和context2。我们遇到一种情况,其中将具有customId = 1的对象插入到context2中,并且从不保存context2。在将来的某个时候,会将对象添加到context1中,同时还将customId = 1。然后保存context1,并在收到完成通知时开始乐趣!我们尝试通过以下方式将保存中的更改合并到context2中:
[context2 mergeChangesFromContextDidSaveNotification:notification];
这可以正常工作,可以合并,然后在context2中有两个对象都具有customId = 1。但是,我想发生的是,在合并时,它以某种方式意识到这两个对象都具有相同的customId,因此,无需执行插入操作,它只是更新现有对象,并在内部使这两个对象成为同一对象(或效果:/)。我以为可以通过重写isEqual和hash来实现,但这是NSManagedObjects所绝对禁止的!
另一个想法是使用validateInsert:当它尝试插入新对象时,告诉它不要复制值。然而,这引起了另一个问题。现在,我们有了一个具有一个对象的持久性存储,而context2具有另一个对象。然后,我们将不得不从context1中删除该对象并保存所做的更改,以从持久性存储中删除该对象...但是由于我们从不想保存context2(这似乎很奇怪,但是我们有充分的理由...我保证! ),则该对象将永远无法保存。
我们基本上希望能够告诉CoreData在完成两次插入之后它们实际上应该是同一对象!如果有人对我们如何做到这一点有任何想法,那么在这一点上的任何帮助将不胜感激!
最佳答案
这种合并策略是您需要处理的,并且不在框架范围内。基本上,您有一个肮脏的沙箱和一个干净的沙箱。当在干净的沙箱中进行更改时,它将传播到脏的沙箱中。
脏沙箱的所有者有责任注意即将发生的更改并对它们做出反应。您可以收听NSManagedObjectContextDidSaveNotification
并检查是否有碰撞。从那里开始,您的业务逻辑将决定接下来发生的事情。