【问题标题】:Parsing CloudKit Error (CKError)解析 CloudKit 错误 (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)。

标签: ios swift cloudkit ckerror


【解决方案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 的其他情况提供了范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 2017-09-19
  • 2023-04-10
相关资源
最近更新 更多