问题描述
我在制作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
将data
与HKQueryAnchor
实例进行交互,即
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
}
}