处理 CloudKit 错误和 CKError
Handling CloudKit errors and CKError
这似乎很基本,但我似乎无法找到正确的方向。
在我的应用程序中,我有此代码来访问 CloudKit 记录:
db.performQuery(query, inZoneWithID: nil) {(results, error) -> Void in
if error != nil {
print("performQuery error on query:\n\(error?.description)")
}
else {
for rec in results! {
// handle the record
}
}
}
这行得通,但有时我会出错;例如:
<CKError 0x155cfaa0: \"Request Rate Limited\" (7/2008); Retry after 1.9 seconds>
我明白为什么会收到错误,但我不知道如何访问 CKError 对象,该对象包含我需要等待的信息并在 - 在本例中 - 1.9 秒(或显示的任何内容)之后重试操作消息中)。 "error" 在闭包中是一个 NSError。
如何访问 CKError 记录并检索它的 CkErrorCode 和 retryAfter 属性,以便我可以优雅地处理重试?
对不起,如果这看起来很基本,但我确实没有找到任何解释它的东西。
您应该检查 NSError 的 userInfo 字典。
if let retryAfterValue = error.userInfo[CKErrorRetryAfterKey] as? NSTimeInterval {
let retryAfterDate = NSDate(timeIntervalSinceNow: retryAfterValue)
// ...
}
通过转换为 CKError 并访问它的成员:
db.performQuery(query, inZoneWithID: nil) {(results, error) -> Void in
guard error == nil else
{
let ckError = error as!CKError
if let retryAfter = ckError.retryAfterSeconds, retryAfter>0.0
{
let retryAfterDate = DispatchTime.now() + ckError.retryAfterSeconds!
// redo the query
return
}
// handle other errors
return
}
// handle the record
}
这似乎很基本,但我似乎无法找到正确的方向。
在我的应用程序中,我有此代码来访问 CloudKit 记录:
db.performQuery(query, inZoneWithID: nil) {(results, error) -> Void in
if error != nil {
print("performQuery error on query:\n\(error?.description)")
}
else {
for rec in results! {
// handle the record
}
}
}
这行得通,但有时我会出错;例如:
<CKError 0x155cfaa0: \"Request Rate Limited\" (7/2008); Retry after 1.9 seconds>
我明白为什么会收到错误,但我不知道如何访问 CKError 对象,该对象包含我需要等待的信息并在 - 在本例中 - 1.9 秒(或显示的任何内容)之后重试操作消息中)。 "error" 在闭包中是一个 NSError。
如何访问 CKError 记录并检索它的 CkErrorCode 和 retryAfter 属性,以便我可以优雅地处理重试?
对不起,如果这看起来很基本,但我确实没有找到任何解释它的东西。
您应该检查 NSError 的 userInfo 字典。
if let retryAfterValue = error.userInfo[CKErrorRetryAfterKey] as? NSTimeInterval {
let retryAfterDate = NSDate(timeIntervalSinceNow: retryAfterValue)
// ...
}
通过转换为 CKError 并访问它的成员:
db.performQuery(query, inZoneWithID: nil) {(results, error) -> Void in
guard error == nil else
{
let ckError = error as!CKError
if let retryAfter = ckError.retryAfterSeconds, retryAfter>0.0
{
let retryAfterDate = DispatchTime.now() + ckError.retryAfterSeconds!
// redo the query
return
}
// handle other errors
return
}
// handle the record
}