CloudKit:使用 CKModifyRecordsOperation 保存记录时出错

CloudKit: Error saving record with CKModifyRecordsOperation

<CKError 0x14d8cb70: "Partial Failure" (2/1011); "Failed to modify some records"; partial errors: {
    B5DEF0B5-F064-4B27-9C89-BE75C9134297:(_defaultZone:__defaultOwner__) = <CKError 0x14d83b70: "Server Record Changed" (14/2037); "Error saving record <CKRecordID: 0x15748cd0; B5DEF0B5-F064-4B27-9C89-BE75C9134297:(_defaultZone:__defaultOwner__)> to server: Protection data didn't match">
}>

我在尝试将 CKRecord 保存到 CloudKit 时遇到此错误。有什么想法吗?

为了方便起见,我是否必须获取第一条记录API?

我正在使用 CKModifyRecordsOperation 方法来更新更多记录。

当您打算进行更新时,您首先需要读取记录,进行更改,然后写入记录。在读取和写入记录之间,您收到一条记录已更改的通知。

如果服务器上记录的版本比您尝试保存的版本新,服务器 returns CKErrorServerRecordChanged 错误。错误对象的 userInfo 字典包含了不同版本的冲突记录。使用这些键检索记录并执行解决冲突所需的任何解决逻辑。

正如下面在您的案例中所讨论的,问题是您将对象保存到数据库并重新创建了 CKRecord 以进行修改。在这种情况下,您需要使用 CKRecord encodeSystemFieldsWithCoder 来持久化系统字段。并通过使用 NSCoder 对其进行初始化来重新创建 CKRecord。您可以使用 NSKeyedArchiver 和 NSKeyedUnarchiver 来保存 CKRecord 并重新创建它。如果您需要示例,请参阅 https://github.com/evermeer/EVCloudKitDao/blob/master/AppMessage/AppMessage/CloudKit/EVCloudKitDao.swift

底部的 fromCKRecord 和 toCKRecord 方法