Может ли свойство 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
Какие детали типа сценариев, о которых вам нужно подумать.