【发布时间】:2018-07-26 20:06:46
【问题描述】:
CloudKit WWDC 视频建议像这样实现同步:
- 跟踪本地更改
- 将更改发送到服务器
- 解决冲突
- 使用 CKFetchRecordChangesOperation 获取服务器更改
- 应用服务器更改
- 保存服务器更改令牌
我在我的应用程序中遵循这种模式,但我遇到了删除和父子关系的问题。
假设我们有一个按类别划分的书籍列表。每本书都必须属于一个类别。
我从这样的数据开始:
SERVER
Thrillers: "Look Out!", "Secret Spy"
Non-Fiction: "Sailing the Seas", "Gardening Adventures"
Computer Programming: <empty>
如您所见,最终类别为空。假设我有两台设备具有这些数据的精确副本。
现在,在设备 1 上,用户将一本书 CloudKit Sync 添加到“计算机编程”:
DEVICE 1
Thrillers: "Look Out!", "Secret Spy"
Non-Fiction: "Sailing the Seas", "Gardening Adventures"
Computer Programming: "CloudKit Sync"
但是在设备 2 上,用户完全删除了“计算机编程”类别(它是空的,所以从设备 2 的角度来看这很好):
DEVICE 2
Thrillers: "Look Out!", "Secret Spy"
Non-Fiction: "Sailing the Seas", "Gardening Adventures"
设备 1 首先同步,因此它会创建一个新的 Book 条目,并将其 parent 字段设置为 Computer Programming。
但现在设备 2 开始其同步过程。它将其更改应用于服务器,因此它删除了与“计算机编程”相对应的CKRecord。这与Device 2的世界观一致,类别为空,可以删除。
但是,当它从服务器中删除此类别时,这对于设备 1 的世界观和服务器本身来说是没有意义的。现在有一本名为 CloudKit Sync 的孤儿书,它有一个指向其父级的悬空指针。
如果我遵循 Apple 的 WWDC 建议,我该如何避免这种情况?根据同步的顺序,我可以很容易地达到不一致的状态,即孤儿书和无效的父参考。
我希望来自设备 2 的 Delete 命令返回一个错误,告诉我我要孤立一本书并阻止该操作发生,所以我可以采取一些措施来解决问题。
这可能吗?还有其他方法可以解决这个问题吗?
【问题讨论】:
标签: ios synchronization icloud cloudkit