2016-01-10 84 views
1

这似乎很基本,但我似乎无法找到任何能够让我朝着正确方向发展的方向。处理CloudKit错误和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秒(或消息中显示的任何内容)。闭包中的“错误”是一个NSError。

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

对不起,如果这似乎是元素,但我确定没有发现任何解释它。

回答

5

您应该检查NSError的userInfo字典。

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

我知道这是简单的东西!感谢您的快速响应和正确答案。 – johnz

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 
}