首页 > 解决方案 > 设置 HKQueryAnchor 时,如何绕过 iOS 12.0 中已弃用的“unarchiveObject(with:)”?

问题描述

我在HKQueryAnchor制作时使用下面的代码来设置一个HKAnchoredObjectQuery但是'unarchiveObject(with:)'已被弃用,我不知道如何用新的API编写它?

private func getAnchor() -> HKQueryAnchor? {
        let encoded = UserDefaults.standard.data(forKey: AnchorKey)
        if(encoded == nil){
            return nil
        }
        
        let anchor = NSKeyedUnarchiver.unarchiveObject(with: encoded!) as? HKQueryAnchor
        return anchor
    }
    
    private func saveAnchor(anchor : HKQueryAnchor) {
        let encoded = NSKeyedArchiver.archivedData(withRootObject: anchor)
        defaults.setValue(encoded, forKey: AnchorKey)
        defaults.synchronize()
    }

标签: iosswifthealthkitnskeyedarchiver

解决方案


这是我根据 Martin R 的链接提出的,看起来好吗?

 private func getAnchor() -> HKQueryAnchor? {
    
       

 let encoded = UserDefaults.standard.data(forKey: AnchorKey)
    
    guard let unwrappedEncoded = encoded else { return nil }
    
    guard let anchor = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(unwrappedEncoded as Data) as? HKQueryAnchor
    else {
        return nil
    }
    
    return anchor
}

private func saveAnchor(anchor : HKQueryAnchor) {
    
    do {
        let encoded = try NSKeyedArchiver.archivedData(withRootObject: anchor, requiringSecureCoding: false)
        defaults.setValue(encoded, forKey: AnchorKey)
        defaults.synchronize()
    } catch {
        return
    }
}

推荐阅读