2015-06-15 27 views
3

在CloudKit的記錄中嘗試處理錯誤時,我遇到了一些問題。CKModifyRecordsOperation無法檢索CKRecords來解決CKErrorCodeServerRecordChanged中的衝突

我成功提取包含部分錯誤的字典,我可以迭代。但是,我無法獲取解決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成功獲取包含recordIDs和部分錯誤的字典):

[<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

我面臨同樣的問題。這是我想的錯誤。剩下的唯一解決方法是使用userInfo字典中返回的CKRecordID從服務器獲取記錄。對該記錄進行更改,然後使用它將其保存到服務器。 –

+0

很高興聽到我不是唯一有這個問題的人。但是取得有衝突的CKRecords是我想避免的解決方案。這意味着很多額外的網絡請求,否則不需要。我現在要求蘋果爲此問題提供技術支持。 –

+0

嗯,我已經通過獲取衝突的CKRecords以相同的方式解決了它。真棒讓我知道你從他們身上學到了什麼! –

回答

0

文檔說它只是一個自定義區域功能。

編輯2016年1月21日:即使在默認區域和公共數據庫中,它也適用於我。這是從以前的一個重大變化。

+0

對不起,我沒有明確地說出來。我實際上正在使用自定義區域,但它不起作用。 –