CloudKit CKModifyRecords操作错误

Posted

技术标签:

【中文标题】CloudKit CKModifyRecords操作错误【英文标题】:CloudKit CKModifyRecordsOperation Error 【发布时间】:2017-04-27 16:59:45 【问题描述】:

我正在使用 CKModifyRecordsOperation 在 CloudKit 中批量创建大约 8000 条记录。但是,对于大约 5% 的记录,我遇到了一个奇怪的错误:record to insert already exists。在彻底调查和重新测试后,我一直无法弄清楚为什么会发生这种情况。需要考虑的注意事项:

    数据库在启动时完全为空。 我使用[NSUUID UUID].UUIDString 方法为每条记录在本地创建一个recordName。在重新测试期间,我还通过创建一组记录名称并将其计数与要上传的总记录计数进行比较,确认没有重复的记录名称。 我通过在批量上传操作中添加一个计数器来比较预上传的总记录数,验证了每条记录只上传一次。 所有记录均已正确上传(将 CloudKit 中的计数与上传的总记录进行比较) - 所以不确定为什么会出现“错误”。

关于为什么会产生这些错误的任何想法?

代码:

- (void)uploadInitialRecordsToCloudKit:(NSArray *)recordsToUpload 

    NSArray *recordsForThisBatch = recordsToUpload;
    NSArray *remainingRecords = nil;

    if ([recordsToUpload count] > 350) recordsForThisBatch = [recordsToUpload subarrayWithRange:NSMakeRange(0, 350)];
    remainingRecords = [recordsToUpload subarrayWithRange:NSMakeRange([recordsForThisBatch count], [recordsToUpload count] -[recordsForThisBatch count])];

    CKModifyRecordsOperation *modifyRecordsOperation = [[CKModifyRecordsOperation alloc] initWithRecordsToSave:recordsForThisBatch recordIDsToDelete:nil];
    modifyRecordsOperation.modifyRecordsCompletionBlock = ^(NSArray<CKRecord *> * _Nullable savedRecords, NSArray<CKRecordID *> * _Nullable deletedRecordIDs, NSError * _Nullable operationError) 

        if (operationError) NSLog(@"Error during batch save to CK: %@\n\n%@", [operationError localizedDescription], operationError.userInfo);
        else NSLog(@"Batch upload to CK successful");

        if ([remainingRecords count] > 0) [self uploadInitialRecordsToCloudKit:remainingRecords];

    ;

    [[CKContainer defaultContainer] publicCloudDatabase] addOperation:modifyRecordsOperation];


【问题讨论】:

使用相关代码编辑您的问题,展示您如何使用操作以及如何进行错误处理。 8000/350 = 22.8 ?您确定要上传的 .8 批记录没有某种重叠吗? 【参考方案1】:

这似乎是 CloudKit 问题,因为第三次测试完成时没有任何错误。

【讨论】:

以上是关于CloudKit CKModifyRecords操作错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能从 Xcode 或 CloudKit Dashboard 查询 CloudKit?

CloudKit iOS 10 错误:帐户无权访问 CloudKit 帐户

CloudKit 批量获取?

CloudKit 的单元测试

cloudKit:公共数据库中的 CKFetchRecordChangesOperation

无法初始化 CloudKit 架构,因为协调器中没有存储配置为使用 CloudKit