假设我使用CKModifyRecordsOperation对象启动saveOperation。我可以安全地假设对象的recordsToSave将存储在操作完成后执行的modifyRecordsCompletionBlock中访问时在开始时给出的记录列表。
我会这么认为,但后来我在Apple doc中看到了这一行(基本上不确定它们的意思是“initial”:数组的初始内容设置为你在initWithRecordsToSave中指定的记录:recordIDsToDelete:method您可以在执行操作之前根据需要修改此数组。
如果在极少数情况下它可以改变,那么我想在我的重试逻辑中采用另一种方式。
EDIT添加了代码
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
completionBlock定义为
^(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
}
}
答案 0 :(得分:1)
根据您添加到问题中的代码,您似乎希望检索最初传递给修改操作的记录数组。
访问self.OperationQ[0].recordsToSave
肯定会返回传递给[[CKModifyRecordsOperation alloc] initWithRecordsToSave:recordsToSave recordIDsToDelete:nil]
您从Apple的文档中引用的消息仅表示如果您的代码更新了recordsToSave
的内容,则可以安全地进行更改,直到您致电addOperation:
。
该操作无法更改该阵列。因此,如果您没有更改它,那么在完成块中访问它将会准确地返回您最初传递的内容。
答案 1 :(得分:0)
简而言之。最后得到的记录列表将是CloudKit已成功更新的记录。有可能无法更新一个或多个,在这种情况下您需要采取适当的措施。
详细介绍了您需要考虑的场景。