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

Ios CloudKit:使用CKModifyRecordsOperation保存记录时出错 }>,ios,cloudkit,Ios,Cloudkit,当尝试保存CKRecords直到CloudKit时,我收到此错误。有什么想法吗 我必须像在便利API中那样获取第一个记录吗 我正在使用CKModifyRecordsOperation方法更新更多记录。当您计划进行更新时,首先需要读取记录,进行更改,然后写入记录。您收到一个通知,在读取和写入记录之间的时间内,该记录已更改 如果服务器上记录的版本比您试图保存的版本新,服务器将返回CKErrorServerRecordChanged错误。错误对象的userInfo字典包含冲突记录的不同版本。使用这些键

当尝试保存
CKRecord
s直到
CloudKit
时,我收到此错误。有什么想法吗

我必须像在便利API中那样获取第一个记录吗


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

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

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


正如下面在您的案例中所讨论的,问题是您将对象持久化到了数据库,并重新创建了CKRecord来进行修改。在这种情况下,您需要使用CKRecord encodeSystemFieldsWithCoder持久化系统字段。并通过使用NSCoder初始化CKRecord来重新创建它。您可以使用NSKeyedArchiver和NSKeyedUnachiver保存CKRecord并重新创建它。如果您需要一个示例,请参见

底部的fromCKRecord和toCKRecord方法,对于1条记录,这是可以的,但是对于更新100-s的记录,我必须先下载,找到哪一条如何修改,然后上载??brbrbrbrbr你不必再读一遍。请参阅我的最新答案。因此,只需将它们全部保存,并在出现错误时使用错误中的记录ID再次尝试更新。您可以使用
-[CKRecord encodeSystemFieldsWithCoder:
仅对记录的系统字段(如更改标记)进行编码。您可以稍后仅使用系统字段取消归档记录,仅将要保存的更改应用到服务器,然后保存记录。如果您已经保存了一个本地记录数据库,该数据库应该可以为您节省往返服务器的时间。我按照您所说的做,(1)读取(2)修改CKRecords(3)保存,并且我非常频繁地使用某一组记录,有时我只收到部分记录,不是我在
CKQuery
的谓词中指定的所有条件,您知道为什么吗?CloudKit返回的结果是有限的。标准记录数似乎是100条,但这可能因iCloud上的总负载而有所不同。如果使用SKQueryOperation,则可以通过设置.results限制CKQueryOperationMaximumResults的默认值来影响需要返回的记录数
<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">
}>