Может ли свойство recordsToSave объекта CKModifyRecordsOperation безопасно использоваться в его modifyRecordsCompletionBlock

Предположим, я запускаю saveOperation с использованием объекта CKModifyRecordsOperation. Могу ли я с уверенностью предположить, что 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
 }
}

2 ответа

Решение

Исходя из кода, который вы добавили в вопрос, кажется, что вы хотите получить массив записей, первоначально переданных операции модификации.

Доступ к self.OperationQ[0].recordsToSave наверняка вернет вам тот же массив, переданный в [[CKModifyRecordsOperation alloc] initWithRecordsToSave:recordsToSave recordIDsToDelete:nil]

Сообщение, на которое вы ссылаетесь из документации Apple, просто означает, что если ваш код обновил содержимое recordsToSaveможно вносить эти изменения до тех пор, пока вы не позвоните addOperation:,

Операция никогда не изменит этот массив. Поэтому, если вы не измените его, то доступ к нему в блоке завершения вернет вам именно то, что вы передали изначально.

Вкратце Нет. Список записей, которые вы получите в конце, будет теми, которые CloudKit успешно обновил. Существует вероятность того, что не удалось обновить один или несколько, и в этом случае вам необходимо предпринять соответствующие действия.

Внимательно посмотрите на эту страницу документации Apple https://developer.apple.com/library/ios/documentation/CloudKit/Reference/CloudKit_constants/index.html

Какие детали типа сценариев, о которых вам нужно подумать.

Другие вопросы по тегам