2015-06-15 1 views
3

У меня возникла проблема при попытке обработать ошибки при выполнении пакетных операций над записями в CloudKit.Не удается получить CKRecords для разрешения конфликтов в CKErrorCodeServerRecordChanged в CKModifyRecordsOperation

Я успешно извлекаю словарь, содержащий частичные ошибки, которые я могу перебрать. Однако я не могу получить записи, необходимые для разрешения конфликта для CKErrorCodeServerRecordChanged. Согласно документации, я должен иметь возможность получить 3 записи из словаря:

  • CKRecordChangedErrorServerRecordKey
  • CKRecordChangedErrorAncestorRecordKey
  • CKRecordChangedErrorClientRecordKey

Благодарим Вас за любые намеки на то, что я здесь делаю неправильно ,

func pushRecordChangesForZoneID(recordZoneID: CKRecordZoneID) { 
// ... 
modifyRecordsOperation.modifyRecordsCompletionBlock = { (savedRecords, deletedRecordIDs, error) -> Void in 
    if (error != nil) { 
     if error.code == CKErrorCode.PartialFailure.rawValue { 
      if let errorDict = error.userInfo?[CKPartialErrorsByItemIDKey] as? [CKRecordID : NSError] { 
       for (recordID, partialError) in errorDict { 
        if partialError.code == CKErrorCode.ServerRecordChanged.rawValue { 
         if let userInfo = partialError.userInfo { 
          let serverRecord = userInfo[CKRecordChangedErrorServerRecordKey] as? CKRecord 
          // serverRecord will always be nil 
         } 
        } 
       } 
      } 
     } 
    } 
} 

}

Дополнительная информация: При печати описание USERINFO Словаре частичной ошибки (partialError.userInfo) она не выглядит, как он содержит другие CKRecords:

[NSDebugDescription: CKInternalErrorDomain: 2037, NSLocalizedDescription: Error saving record <CKRecordID: 0x7fb41bf7e640; DA39FE08-AB0B-4F07-A42E-F5732B114706:(userData:__defaultOwner__)> to server: Protection data didn't match, NSUnderlyingError: <CKError 0x7fd89a92d370: "Unknown Error" (2037)>] 

Описание словаря исходной ошибки (errorDict) выглядит следующим образом (и я могу успешно получить словарь, содержащий идентификаторы записи и частичные ошибки, через CKPartialErrorsByItemIDKey):

[<CKRecordID: 0x7fb5bb88afa0; C1575083-F992-448A-8D77-D62C4A42D696:(userData:__defaultOwner__)>: <CKError 0x7fb5b961c6a0: "Batch Request Failed" (22/2024); server message = "Atomic failure"; uuid = 1E4C0FD5-EC10-4071-B277-102A9F1B0E5E; container ID = "iCloud.net.neverthesamecolor.atsumeru">, <CKRecordID: 0x7fb5bb848ad0; DA39FE08-AB0B-4F07-A42E-F5732B114706:(userData:__defaultOwner__)>: <CKError 0x7fb5b9653060: "Server Record Changed" (14/2037); "Error saving record <CKRecordID: 0x7fb41bd9ca50; DA39FE08-AB0B-4F07-A42E-F5732B114706:(userData:__defaultOwner__)> to server: Protection data didn't match">] 
+0

У меня такая же проблема. Думаю, это ошибка. Единственным обходным решением является извлечение записи с сервера с помощью CKRecordID, возвращаемого в словаре пользовательской информации. Внесите изменения в эту запись, а затем используйте ее, чтобы сохранить ее на сервере. –

+0

Приятно слышать, что я не единственный с этой проблемой. Но выбор CKRecords, у которого есть конфликт, является решением, которое я бы хотел избежать. Это означало бы множество дополнительных сетевых запросов, которые в противном случае не были бы необходимы. Я запросил техническую поддержку в Apple для этой проблемы сейчас. –

+0

Ну, я решил это так же, извлекая CKRecords с конфликтами. Удивительный Позвольте мне знать, что вы узнаете от них! –

ответ

0

Документы говорят, что это пользовательская функция зоны.

Редактировать 21 января 2016 года. Он работает для меня прямо сейчас даже в зоне по умолчанию и в базе данных общего доступа. Это большое изменение с самого начала.

+0

Извините, я не сказал об этом прямо. Я фактически работаю с пользовательской зоной, но она не работает. –