2016-04-26 20 views
4

我需要一些幫助,以瞭解如何通過CloudKit獲取記錄時正確處理錯誤。目前我有一款應用程序可以在雲中保存大量記錄,並在啓動時加載它們。我一直在使用CKReference來引用記錄,並隨時保存參考文獻,我使用CKReferenceAction.DeleteSelf選項。我週期性遇到的一個問題是,當引用的記錄被刪除時,有時在引用刪除之前可能會有相當長的時間。這使我偶爾會遇到這樣的情況:我的應用程序已經爲CKReference取得了一條不再存在的記錄。我可以通過在我的錯誤處理程序中插入print(error!)來手動找出何時發生這種情況。我想知道的是我如何添加一些代碼來檢測這個特定的錯誤,即if error.localizedDescription == ??? {。 這裏是我使用的基本代碼的獲取:CloudKit Error Differentiation

let fetch = CKFetchRecordsOperation(recordIDs: recordIDs) 
fetch.perRecordCompletionBlock = { (record:CKRecord?, recordID:CKRecordID?, error: NSError?) in 

    if error != nil { 

     // Error Line A (See below) 
     print("ERROR! : \(error!.localizedDescription)") 

     // Error Line B (See below) 
     print("ERROR: \(error!)") 

    } 

    else if let record = record { 

     // Record was found 
    } 
} 
if let database = self.privateDatabase { 
    fetch.database = database 
    fetch.start() 
} 

然後當它試圖獲取不存在的記錄,這裏是在編譯器窗口打印出錯誤消息:

一)ERROR! : Error fetching record <CKRecordID: 0x10025b290; dbbda7c3-adcc-4271-848f-6702160ea34f:(_defaultZone:__defaultOwner__)> from server: Record not found

b)ERROR: <CKError 0x125e82820: "Unknown Item" (11/2003); server message = "Record not found"; uuid = (removed); container ID = "(removed)">

以上錯誤線b,它說:CKError 0x125e82820:,我可以用它來創建一個if語句來檢查此特定錯誤類型?我真的可以使用任何幫助找到一種方法來正確解決這個問題。我爲我的應用程序設置了一些加載結構,並且在它認爲有需要查找的記錄時,卻無法找到它,從而導致我的加載過程失敗。我非常感謝任何幫助,我認爲這是一個簡單的解決方案,但顯然不是我能找到的。謝謝!

更新 -

感謝@AaronBrager,我能夠找到正確的解決方案。您可以驗證錯誤代碼以將其與任何特定錯誤進行匹配,並驗證該域是否爲CKError。下面是對我的作品的解決方案:

let fetch = CKFetchRecordsOperation(recordIDs: recordIDs) 
fetch.perRecordCompletionBlock = { (record:CKRecord?, recordID:CKRecordID?, error: NSError?) in 

    if error != nil { 

     if error!.code == CKErrorCode.UnknownItem.rawValue && error!.domain == CKErrorDomain { 

      // This works great! 

     } 

    } 

    else if let record = record { 

     // Record was found 

    } 
} 
if let database = self.publicDatabase { 
    fetch.database = database 
    fetch.start() 
} 
+0

您應該能夠通過檢查其「域」和「代碼」變量來唯一標識錯誤的原因。相同的'域'和'代碼',同樣的問題。與'localizedDescription'不同,它不會在用戶之間改變。 –

+0

因此,如果我只是添加一些邏輯,如'error.code == CKErrorCode.UnknownItem',我應該始終能夠識別相同的錯誤?我會測試一下。謝謝 – Pierce

+0

您應該測試代碼_和domain_,因爲錯誤對象可能不是CloudKit錯誤。 –

回答

2

您應該能夠通過檢查其domaincode變量唯一標識錯誤的原因。相同domaincode,同樣的問題。不像localizedDescription,它不會在用戶之間改變。