代码之家  ›  专栏  ›  技术社区  ›  Ivan Cantarino

分析CloudKit错误(ckerror)

  •  3
  • Ivan Cantarino  · 技术社区  · 7 年前

    我正在使用cloudkit并检查是否已经创建了特定区域。

    在这个例子中,假设没有设置区域,那么cloudkit会检索一个 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 是吗?

    1 回复  |  直到 7 年前
        1
  •  4
  •   rmaddy    7 年前

    钥匙插入 _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)
    }
    
    推荐文章