Dre*_*ack 6 macos cocoa sync core-data icloud
考虑以下简单实体模型:实体A与实体B的一对一关系称为b.实体B具有称为a的反向关系.两种关系都不是可选的.
A B
b < ----- > a
Run Code Online (Sandbox Code Playgroud)
假设我们有两个设备(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,现在只剩下关系一个等于零.的一个关系是非可选的,所以发生验证错误.
设备2上会出现类似的情况,因为有两个B对象,并且只有一个A对象要关联.因此必须始终存在验证错误,因为B对象中的一个必须具有设置为nil 的关系.
更糟糕的是,任何未来的更改都会留下错误的B对象,因此验证失败.实际上,用户无法通过重置关系来自行解决问题.它永久地被打破了.
问题是,如何解决这样的验证错误?这一切都发生在NSPersistentStoreDidImportUbiquitousContentChangesNotification触发通知之前.它不是应用程序main NSManagedObjectContext中的验证错误,它是在将事务日志初始导入持久性存储期间发生的验证错误.
我能想到的唯一选择可能是尝试删除自定义setter(setA:)中的无效B对象,或者validateA:error:B类本身上的KVC验证方法(),因为这些似乎在事务日志导入期间被触发.但我不确定是否允许这样的副作用,当我尝试它时,它确实会导致令人讨厌的日志消息.
任何人都知道处理这个问题的正确方法是什么?
在 Apple 开发者论坛上查看此主题:
https://devforums.apple.com/message/641930#641930
苹果员工对此做出了回应。简而言之:
1) 这是当前版本的 iOS (5.1) 和 OS X (10.7.3) 下 Core Data iCloud 同步中的一个已知错误。
2) 如果关系对于验证谓词来说是非可选的,则同步将完全停止。因此,您需要暂时删除验证以保持事情顺利进行。然而,这样做会使设备的数据不匹配。
3)对此没有官方解决方法。一种比较混乱的方法是维护一个单独的属性来跟踪关系。然后,您需要扫描通过 iCloud 更改的所有对象,并修复关系(如果为零)。
我也被这个虫子咬了。与遇到麻烦的客户打交道非常令人沮丧。希望苹果能尽快推出修复程序...
| 归档时间: |
|
| 查看次数: |
1356 次 |
| 最近记录: |