CloudKit中批处理的结果是“Limit Exceeded”

BB-*_*B-8 4 iphone ios cloudkit

在 CloudKit 中,我尝试通过批处理来保存大量记录。但是,我的应用程序因以下错误而崩溃:

推送本地数据时出错:<CKError 0x15a69e640: "Limit Exceeded" (27/1020); “您的请求包含 561 个项目,超过单个请求中的最大项目数 (400)">

这是我的代码:

CKModifyRecordsOperation *modifyRecordsOperation = [[CKModifyRecordsOperation alloc] initWithRecordsToSave:localChanges recordIDsToDelete: localDeletions];
modifyRecordsOperation.savePolicy = CKRecordSaveAllKeys;
?
modifyRecordsOperation.modifyRecordsCompletionBlock = ^(NSArray *savedRecords, NSArray *deletedRecordIDs, NSError *error) {
    if (error) {
        NSLog(@"[%@] Error pushing local data: %@", self.class, error);
    }
};

[privateDatabase addOperation:modifyRecordsOperation];
Run Code Online (Sandbox Code Playgroud)

如果我要获取一条记录,似乎所有内容都可以通过设置resultsLimitin来获得CKQueryOperation

/sf/ask/1693439961/

/sf/ask/1842725041/

https://forums.developer.apple.com/thread/11121

当我想在批处理中使用 保存大量记录时CKModifyRecordsOperation,有没有办法消除限制?

bre*_*les 5

恐怕没有办法消除这个限制。而且您也不能指望它是 400 - 服务器可能会决定拒绝任何大小的请求。

相反,CKErrorLimitExceeded按照 Apple 的建议处理错误:将操作重构为多个较小的批次(即多个 CKModifyRecordsOperations)。

为保证获取和保存记录的速度,服务器可能会拒绝大型操作。发生这种情况时,块会报告 CKErrorLimitExceeded 错误。您的应用程序应处理此错误,并将操作重构为多个较小的批次。

来源:CKModifyRecordsOperation 类参考

所以总结一下:

  1. 尝试使用要保存的一批记录执行 CKModifyRecordsOperation。
  2. 如果操作返回CKErrorLimitExceeded,则将这批记录拆分为多个较小的批次,并将它们作为多个 CKModifyRecordsOperations 提交。(一个简单的拆分就是将批次分成两半,但这取决于诸如批次中的新记录中是否有 CKReferences 等因素。)
  3. 如果这些新的 CKModifyRecordsOperations 中的任何一个失败CKErrorLimitExceeded,则拆分它们的记录......等等。