设置HKQueryAnchor时,如何在iOS 12.0中弃用“ unarchiveObjectwith :)”?

问题描述

我在制作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()
    }

解决方法

尝试使用 JSONDecoder JSONEncoder dataHKQueryAnchor实例进行交互,即

private func getAnchor() -> HKQueryAnchor? {
    guard let encoded = UserDefaults.standard.data(forKey: AnchorKey) else {
        return nil
    }

    let anchor = try? JSONDecoder().decode(HKQueryAnchor.self,from: encoded)
    return anchor
}

private func saveAnchor(anchor : HKQueryAnchor) {
    if let encoded = try? JSONEncoder().encode(anchor) {
        defaults.setValue(encoded,forKey: AnchorKey)
        defaults.synchronize()
    }
}
,

这是我根据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
    }
}