处理 CloudKit 错误和 CKError

Posted

技术标签:

【中文标题】处理 CloudKit 错误和 CKError【英文标题】:Handling CloudKit errors and CKError 【发布时间】:2016-01-10 01:06:43 【问题描述】:

这似乎是基本的,但我似乎无法找到引导我走向正确方向的方法。

在我的应用程序中,我有这段代码可以访问 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 属性,以便我可以优雅地处理重试?

对不起,如果这看起来很简单,但我肯定没有找到任何解释它的东西。

【问题讨论】:

【参考方案1】:

你应该检查 NSError 的 userInfo 字典。

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

【讨论】:

我知道这很简单!感谢您的快速响应和正确答案。【参考方案2】:

通过转换为 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 错误和 CKError的主要内容,如果未能解决你的问题,请参考以下文章

CloudKit 错误处理 - 重试逻辑

swift Swift - CloudKit:保存和处理错误示例

CloudKit 光标错误和无法返回所有行 - 获取记录时遇到错误

使用 CloudKit 处理用户帐户的正确方法

swift Swift - CloudKit错误助手功能和扩展

在开发中测试 CloudKit 中的 CKErrorUserDeletedZone