2016-08-10 13 views
2

CloudKitでは、バッチ処理で大量のレコードを保存しようとしました。しかし、私のアプリは、次のエラーでクラッシュした:CloudKitのバッチ処理結果が「限界超過」

Error pushing local data: <CKError 0x15a69e640: "Limit Exceeded" (27/1020); "Your request contains 561 items which is more than the maximum number of items in a single request (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]; 

、すべてがCKQueryOperationresultsLimitを設定することにより得ることができるようです。

https://stackoverflow.com/questions/24191999/cloudkit-count-records

https://stackoverflow.com/questions/26324643/cloudkit-your-request-contains-more-than-the-maximum-number-of-items-in-a-singl

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

私はCKModifyRecordsOperationを使用してバッチ処理で大量のレコードを保存したい場合は、制限を解消する方法はありますか?

答えて

2

制限をなくす方法はありません。そして、あなたはそれが400であると数えることはできません - サーバーはどんなサイズの要求も拒否することを決定するかもしれません。

代わりに、CKErrorLimitExceededエラーを処理します。これは、操作を複数の小さなバッチ(つまり複数のCKModifyRecordsOperations)にリファクタリングすることによって提案されています。

To ensure the speed of fetching and saving records, the server may reject large operations. When this occurs, a block reports the CKErrorLimitExceeded error. Your app should handle this error, and refactor the operation into multiple smaller batches.

出典:CKModifyRecordsOperation Class Reference

だから、要約する:

  1. を保存したいレコードのバッチでCKModifyRecordsOperationを試みます。
  2. 操作がCKErrorLimitExceededを返す場合は、レコードのバッチを複数の小さなバッチに分割し、複数のCKModifyRecordsOperationsとして送信します。単純な分割は、バッチを半分に分割するだけですが、これはバッチ内の新しいレコード間にCKReferenceがあるかどうかなどの要素によって異なります)。
  3. 新しいCKModifyRecordsOperationsのいずれかがCKErrorLimitExceededで失敗する場合は、レコードを分割します。 ..、など。
関連する問題