CKModifyRecordsOperation 对象的 recordsToSave 属性 是否可以安全地用于其 modifyRecordsCompletionBlock
Can the recordsToSave property of CKModifyRecordsOperation object be safely used in its modifyRecordsCompletionBlock
假设我使用 CKModifyRecordsOperation 对象启动一个 saveOperation。我可以安全地假设当我在操作完成后执行的 modifyRecordsCompletionBlock 中访问它时,对象的 recordsToSave 将存储开始时给定的记录列表。
我假设是这样,但后来我在 Apple 文档中看到了这一行(基本上不确定 "initial" 是什么意思:数组的初始内容设置为您在 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
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
}
}
简而言之,不是。您最后获得的记录列表将是CloudKit已成功更新的记录。有可能更新一个或多个失败,在这种情况下您需要采取适当的措施。
其中详细说明了您需要考虑的场景类型。
根据您添加到问题中的代码,您似乎希望检索最初传递给修改操作的记录数组。
访问self.OperationQ[0].recordsToSave
肯定会返回传递给[[CKModifyRecordsOperation alloc] initWithRecordsToSave:recordsToSave recordIDsToDelete:nil]
的相同数组
您从 Apple 文档中引用的消息仅表示如果您的代码更新了 recordsToSave
的内容,在您调用 addOperation:
.
之前进行这些更改是安全的
该操作永远不会更改该数组。因此,如果您不更改它,那么在完成块中访问它将会准确地返回您最初传入的内容。
假设我使用 CKModifyRecordsOperation 对象启动一个 saveOperation。我可以安全地假设当我在操作完成后执行的 modifyRecordsCompletionBlock 中访问它时,对象的 recordsToSave 将存储开始时给定的记录列表。
我假设是这样,但后来我在 Apple 文档中看到了这一行(基本上不确定 "initial" 是什么意思:数组的初始内容设置为您在 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
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
}
}
简而言之,不是。您最后获得的记录列表将是CloudKit已成功更新的记录。有可能更新一个或多个失败,在这种情况下您需要采取适当的措施。
其中详细说明了您需要考虑的场景类型。
根据您添加到问题中的代码,您似乎希望检索最初传递给修改操作的记录数组。
访问self.OperationQ[0].recordsToSave
肯定会返回传递给[[CKModifyRecordsOperation alloc] initWithRecordsToSave:recordsToSave recordIDsToDelete:nil]
您从 Apple 文档中引用的消息仅表示如果您的代码更新了 recordsToSave
的内容,在您调用 addOperation:
.
该操作永远不会更改该数组。因此,如果您不更改它,那么在完成块中访问它将会准确地返回您最初传入的内容。