CloudKit错误区分

时间:2016-04-26 23:08:04

标签: ios swift cloudkit nserror

我需要一些帮助来了解如何在通过CloudKit获取记录时正确处理错误。目前我有一个应用程序可以在云中保存大量记录,并在启动时加载它们。我一直使用CKReference引用记录,只要保存引用,我就会使用CKReferenceAction.DeleteSelf选项。我定期遇到的一个问题是,当删除引用的记录时,有时在引用删除自身之前可能会有相当长的时间。这导致我偶尔遇到我的应用程序为不再存在的记录提取CKReference的情况。我可以通过在错误处理程序中插入print(error!)来手动找出何时发生这种情况。我想知道的是我如何添加一些代码来检测这个特定的错误,即if error.localizedDescription == ??? {。 以下是我用于获取的基本代码:

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()
}

然后当它尝试获取不存在的记录时,这是在编译器窗口中输出的错误消息:

a)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()
}

1 个答案:

答案 0 :(得分:2)

您应该能够通过检查其domaincode变量来唯一地识别错误的原因。相同domaincode,同样的问题。与localizedDescription不同,它不会在用户之间发生变化。