0

假设我使用 CKModifyRecordsOperation 对象启动 saveOperation。我可以安全地假设对象的 recordsToSave 将存储在我在操作完成后执行的 modifyRecordsCompletionBlock 中访问它时在开始时给出的记录列表。

我会假设是这样,但是后来我在 Apple 文档中看到了这一行(基本上不确定“初始”是什么意思:数组的初始内容设置为您在 initWithRecordsToSave:recordIDsToDelete: 方法中指定的记录。您可以在执行操作之前根据需要修改此数组。

如果在极少数情况下它可以改变,那么我想在我的重试逻辑中采用另一种方式。

编辑添加代码

   CKModifyRecordsOperation *saveOperation = [[CKModifyRecordsOperation alloc] initWithRecordsToSave:recordsToSave recordIDsToDelete:nil] ;
saveOperation.modifyRecordsCompletionBlock = completionBlock ; //see completion block definition below
[self.publicDatabase addOperation:saveOperation] ; 

[self.OperationQ addObject: saveOperation] ; //Saved in Q for later retrieval 

完成块定义为

  ^(NSArray *savedRecords, NSArray *deletedRecordIDs, NSError * operationError){
 if(operationError)
 {
    DDLogError(@"Save of Touch event records failed with error %@",operationError) ;
    //Retry, can I do this and safely assume first record retrieved here is the first record I inserted into original recordsToSave array

    CKRecord *cardinalRecord = self.OperationQ[0].recordsToSave[0] ;

     //Read a field from it to decide how to handle retry (e.g: retry after delay if important set of records, don't retry if not etc)..
 }
 else
 {
   //Handle success case
 }
}
4

2 回答 2

1

根据您添加到问题中的代码,您似乎希望检索最初传递给修改操作的记录数组。

访问self.OperationQ[0].recordsToSave肯定会给你传回相同的数组[[CKModifyRecordsOperation alloc] initWithRecordsToSave:recordsToSave recordIDsToDelete:nil]

您从 Apple 文档中引用的消息仅意味着如果您的代码更新了 的内容recordsToSave,那么在您调用之前进行这些更改是安全的addOperation:

该操作永远不会更改该数组。因此,如果您不更改它,那么在完成块中访问它会返回您最初传入的内容。

于 2016-03-23T16:45:46.077 回答
0

简而言之,没有。您最后获得的记录列表将是 CloudKit 已成功更新的记录。它有可能无法更新一个或多个,在这种情况下您需要采取适当的措施。

仔细看看这个苹果文档页面https://developer.apple.com/library/ios/documentation/CloudKit/Reference/CloudKit_constants/index.html#//apple_ref/doc/constant_group/Record_Changed_Error_Keys

其中详细说明了您需要考虑的场景类型。

于 2016-03-23T05:13:10.467 回答