代码之家  ›  专栏  ›  技术社区  ›  Smart Home

CKModifyRecordsOperation对象的recordsToSave属性能否在其modifyRecord CompletionBlock中安全使用

  •  0
  • Smart Home  · 技术社区  · 8 年前

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

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

    如果在极少数情况下它可以改变,那么我想在我的重试逻辑中走另一条路。

    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
     }
    }
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   rmaddy    8 年前

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

    正在访问 self.OperationQ[0].recordsToSave 肯定会把传递给你的数组还给你 [[CKModifyRecordsOperation alloc] initWithRecordsToSave:recordsToSave recordIDsToDelete:nil]

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

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

        2
  •  0
  •   user3069232    8 年前

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

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

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