Ios 处理CloudKit错误和CKError

Ios 处理CloudKit错误和CKError,ios,cloudkit,Ios,Cloudkit,这似乎是基本的,但我似乎找不到任何指引我正确方向的东西 在我的应用程序中,我使用以下代码访问CloudKit记录: db.performQuery(query, inZoneWithID: nil) {(results, error) -> Void in if error != nil { print("performQuery error on query:\n\(error?.description)") } else { for re

这似乎是基本的,但我似乎找不到任何指引我正确方向的东西

在我的应用程序中,我使用以下代码访问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秒(本例中为1.9秒)后重试操作(或消息中显示的任何内容)。闭包中的“错误”是一个N错误

如何访问CKError记录并检索该记录的CkErrorCode和retryAfter属性,以便能够正常地处理重试


如果这看起来很简单,很抱歉,但我肯定没有找到任何解释。

您应该查看NSError的userInfo字典

    if let retryAfterValue = error.userInfo[CKErrorRetryAfterKey] as? NSTimeInterval {
        let retryAfterDate = NSDate(timeIntervalSinceNow: retryAfterValue)
        // ...
    }

您应该检查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
}

通过转换为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
}

我知道这很简单!谢谢你快速的回答和正确的答案。我知道这很简单!感谢您的快速回复和正确答案。