考虑以下简单的实体模型:实体 A 与实体 B 具有一对一的关系,称为b。实体 B 具有称为a的逆一对一关系。这两种关系都不是可选的。
A B
b < ----- > a
假设我们有两个设备 (1) 和 (2) 开始完全同步。每个都有一个 A 类对象和一个 B 类对象,它们相互关联。在设备 1 上,我们有对象 A1 和 B1,在设备 B 上,我们有相同的逻辑对象 A1 和 B1。
现在假设在每个设备上进行了模拟更改:
在设备 1 上,我们删除 B1,插入 B2,并将 A1 与 B2 关联。然后保存更改。
在设备 2 上,我们删除 B1,插入 B3,并将 A1 与 B3 关联。然后保存更改。
设备 1 现在尝试从设备 2 导入事务日志。将插入 B3,并且 A1 将与 B3 关联。到目前为止一切顺利,但 B2 现在留下的关系a等于nil。a关系是非可选的,因此会发生验证错误。
在设备 2 上也会发生类似的情况,因为有两个 B 对象,并且只有一个 A 对象要关联。因此,必须始终存在验证错误,因为 B 对象之一必须将a关系设置为nil。
更糟糕的是,任何未来的更改都会留下一个错误的 B 对象,因此验证失败。实际上,用户不能通过重置关系自己解决问题。它永久损坏。
问题是,如何解决这样的验证错误?这一切都发生在NSPersistentStoreDidImportUbiquitousContentChangesNotification
通知被触发之前。这不是您的应用程序 mainNSManagedObjectContext
中的验证错误,而是在将事务日志初始导入持久存储期间发生的验证错误。
我能想到的唯一选择可能是尝试在自定义设置器setA:
(validateA:error:
. 但是我不确定是否允许这样的副作用,当我尝试它时,它似乎确实会导致令人讨厌的日志消息。
有谁知道处理这个问题的正确方法是什么?