CloudKit 错误区分
CloudKit Error Differentiation
我需要一些帮助来了解如何在通过 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()
}
然后当它试图获取不存在的记录时,这是在编译器中打印出的错误消息 window:
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
不同的是,它不会在用户之间改变。
我需要一些帮助来了解如何在通过 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()
}
然后当它试图获取不存在的记录时,这是在编译器中打印出的错误消息 window:
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
不同的是,它不会在用户之间改变。