【发布时间】:2023-04-10 21:22:01
【问题描述】:
我需要一些帮助来了解如何在通过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()
}
【问题讨论】:
-
您应该能够通过检查其
domain和code变量来唯一识别错误的原因。相同的domain和code,同样的问题。与localizedDescription不同,它不会在用户之间改变。 -
所以如果我添加一些逻辑,例如:
if error.code == CKErrorCode.UnknownItem,我应该能够始终识别相同的错误:我会测试一下。谢谢 -
您应该测试代码和域,因为错误对象可能不是 CloudKit 错误。
-
@AarronBrager 感谢您的快速回复。我刚刚发现通过测试代码,那一半效果很好。我确实必须确保将
.rawValue添加到末尾,所以if error.code == CKErrorCode.UnkownItem.rawValue。我不太确定如何编写逻辑来测试域。您介意发布一个答案,以便我接受它作为正确答案吗? -
其实我只是发现检查域很容易。我会发布更新,但如果您想提交答案,我会接受您的正确答案。
标签: ios swift cloudkit nserror