解析 CloudKit 错误 (CKError)
Posted
技术标签:
【中文标题】解析 CloudKit 错误 (CKError)【英文标题】:Parsing CloudKit Error (CKError) 【发布时间】:2018-07-05 15:41:06 【问题描述】:我正在使用 CloudKit,并且正在检查是否已经创建了特定区域。
对于这个例子,假设一个区域没有设置,所以 CloudKit 检索我一个CKError
。
此CKError
有一个名为partialErrorsByItemID
的属性,其类型为[AnyHashable : Error]?
代码如下:
fileprivate func checkIfZonesWereCreated()
let privateDB = CKContainer.default().privateCloudDatabase
let op = CKFetchRecordZonesOperation(recordZoneIDs: [zoneID1, zoneID2])
op.fetchRecordZonesCompletionBlock = (dict, err) in
if let err = err as? CKError, let _err = err.partialErrorsByItemID
print(_err)
/* prints
[AnyHashable(<CKRecordZoneID: 0x60800003cba0; ownerName=__defaultOwner__, zoneName=TestZone>): <CKError 0x60400005a760: "Zone Not Found" (26/2036); server message = "Zone 'TestZone' does not exist"; uuid = ...-2DF4E13F81E2; container ID = "iCloud.com.someContainer">]
*/
// If I iterate through the dictionary
_err.forEach( (k, v) in
print("key:", k) // prints: key: <CKRecordZoneID: 0x60800002d9e0; ownerName=__defaultOwner__, zoneName=TestZone>
print("value:", v) // prints: value: <CKError 0x60400005a760: "Zone Not Found" (26/2036); server message = "Zone 'TestZone' does not exist"; uuid = ...-2DF4E13F81E2; container ID = "iCloud.com.someContainer
)
return
print("dict:", dict)
privateDB.add(op)
如何解析这个错误?我需要访问zoneName
?
【问题讨论】:
用更多代码更新您的问题,显示您对 CloudKit 的调用以及您当前的错误处理。 @rmaddy 我尝试将key
转换为Dictionary<String, Any>
,但它不起作用。如果是这样,我可以访问 zoneName
子键然后获取值
您可以尝试将_err
转换为[AnyHashable : Any]
,然后使用zoneID
作为键来获取CKError
值(将其转换为CKError
)最后访问CKError.code
( zone not found 的 CKError.code 原始值为 26)。
【参考方案1】:
_err
中的键是 CKRecordZoneID
。完成后,使用zoneName
属性获取区域名称。
我会写你的代码如下:
fileprivate func checkIfZonesWereCreated()
let privateDB = CKContainer.default().privateCloudDatabase
let op = CKFetchRecordZonesOperation(recordZoneIDs: [zoneID1, zoneID2])
op.fetchRecordZonesCompletionBlock = (dict, err) in
if let err = err as? CKError
switch err
case CKError.partialFailure:
if let _err = err.partialErrorsByItemID
for key in _err.keys
if let zone = key as? CKRecordZoneID
let name = zone.zoneName
print("Missing zone: \(name)")
return
default:
break
print("dict:", dict)
privateDB.add(op)
【讨论】:
这太好了!如果你只知道你“救了我的命”多少次。非常感谢。 很好的答案。还为处理CKError
的其他情况提供了范围。以上是关于解析 CloudKit 错误 (CKError)的主要内容,如果未能解决你的问题,请参考以下文章
CloudKit CKError“无效参数”和“错误同步延续数据”
CloudKit“订阅重复”错误 - 获取 SubscriptionId
CKContainer requestApplicationPermission 中的服务不可用错误(CKError Code 6)