处理CloudKit错误和CKError

时间:2016-01-10 01:06:44

标签: 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 rec in results! {
             // handle the record
        }
    }
 }

这有效,但有时我会收到错误;例如:

<CKError 0x155cfaa0: \"Request Rate Limited\" (7/2008); Retry after 1.9 seconds>

我理解为什么我会收到错误,但我不知道如何访问CKError对象,该对象具有我需要等待的信息并在之后重试操作 - 在这种情况下 - 1.9秒(或者在信息)。闭包中的“错误”是NSError。

如何访问CKError记录并检索CkErrorCode和retryAfter属性,以便我可以优雅地处理重试?

很抱歉,如果这看起来很元素,但我确定没有找到解释它的任何内容。

2 个答案:

答案 0 :(得分:5)

您应该检查NSError的userInfo字典。

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

答案 1 :(得分:1)

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