解析 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&lt;String, Any&gt;,但它不起作用。如果是这样,我可以访问 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 查询的奇怪错误

CloudKit CKError“无效参数”和“错误同步延续数据”

CloudKit“订阅重复”错误 - 获取 SubscriptionId

如何在cloudkit上存储数据

CKContainer requestApplicationPermission 中的服务不可用错误(CKError Code 6)

cloudKit:CKSubscription 错误“此请求需要经过身份验证的帐户””