【发布时间】:2026-02-16 15:10:01
【问题描述】:
我正在开发一个应用程序,该应用程序将数据从外部 Web 服务提取到私有 CloudKit 数据库中。该应用程序是单用户应用程序,但是我遇到了我不知道如何避免的竞争条件。
我的外部数据中的每条记录都有一个唯一标识符,我将其映射到我的 CKRecord 实例。一般的应用启动流程是:
- 获取相关记录类型的当前 CKRecords。
- 获取外部记录。
- 对于每个外部记录,如果CloudKit中不存在,则通过批量创建(修改操作)创建。
现在的问题是,如果这个过程同时在用户的两个设备上启动,因为 CK 和外部提取都是异步的,我很可能会得到重复的记录。
我知道我可以使用区域以原子方式提交我的所有 CKRecord 实例,但我认为这不能解决我的问题,因为如果所有这些提取基本上同时发生,那么保存就不是真正的问题。
我的问题是:
- 是否有人知道“锁定”私有数据库以在所有用户设备上进行写入的方法?
- 或者,有没有办法对任何 CKRecord 字段强制执行唯一性?
- 或者,有没有办法使用自定义值作为主键,在这种情况下,我可以使用我的外部 ID 作为 CK ID,并允许系统自行防止重复。
提前感谢您的帮助!
【问题讨论】:
-
所以看起来我实际上可以将自定义名称传递给我自己的自定义 CKRecordID,谁能告诉我这是否是正确的方法?
-
是的,您可以添加自己的 CKRecordID。然后它必须在整个容器中是唯一的(也可以在多个记录类型中)
标签: ios objective-c icloud cloudkit