gpt4 book ai didi

ios - CloudKit:防止重复记录

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:42:44 24 4
gpt4 key购买 nike

我正在使用一个应用程序将数据从外部网络服务提取到私有(private) CloudKit 数据库中。该应用程序是一个单用户应用程序,但是我遇到了我不确定如何避免的竞争条件。

我的外部数据中的每条记录都有一个映射到我的 CKRecord 实例的唯一标识符。一般的应用程序启动流程是:

  1. 获取相关记录类型的当前 CKRecords。
  2. 获取外部记录。
  3. 对于每个外部记录,如果 CloudKit 中不存在,则通过批量创建(修改操作)创建它。

现在的问题是,如果此过程同时在用户的两个设备上启动,由于 CK 和外部提取都是异步的,我很可能会得到重复的记录。

我知道我可以使用区域以原子方式提交我的所有 CKRecord 实例,但我认为这不能解决我的问题,因为如果所有这些提取基本上同时发生,那么保存就不是真正的问题。

我的问题是:

  1. 有没有人知道一种方法可以“锁定”私有(private)数据库以便在用户的所有设备上进行写入?
  2. 或者,有没有办法在任何 CKRecord 字段上强制执行唯一性?
  3. 或者,有没有一种方法可以使用自定义值作为主键,在这种情况下,我可以使用我的外部 ID 作为 CK ID,并允许系统自身防止重复。

提前感谢您的帮助!

最佳答案

答案:

  1. 不,您不能锁定私有(private)数据库
  2. Cloudkit 已经强制执行并假设您的记录 ID 是唯一的
  3. 您可以根据自己的喜好制作记录 ID(在它的非区域部分)。

说明:

关于您的重复问题。如果您是创建记录 ID 的人(例如,来自您提到的外部记录),那么在最坏的情况下,如果您有竞争条件,您应该让一条记录用相同的数据覆盖另一条记录。对于两个设备同时启动此过程的极端情况,我认为这不是问题。基本上,您首先获取现有记录然后修改它们的逻辑对我来说似乎很合理。

代码:

//employeeID is a unique ID to identify an employee
let employeeID = "001"

//Remember the recordID needs to be unique within the same database.
//Assuming you have different record types, it is better to prefix the record name with the record type so that it is unique
let recordName = "Employee-\(employeeID)"

//If you are using a custom zone
let customZoneID = CKRecordZoneID(zoneName: "SomeCustomZone", ownerName: CKCurrentUserDefaultName)
let recordIDInCustomZone = CKRecordID(recordName: recordName, zoneID: customZoneID)

//If you are using the default zone
let recordIDInDefaultZone = CKRecordID(recordName: recordName)

关于ios - CloudKit:防止重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30711139/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com