所以我有点沮丧,因为苹果用一个易于处理的透明的NSUInteger
替换了一个HKQueryAnchor
,但没有提供一种简单的方法来持久化这个HKQueryAnchor
。有人找到了使用NSUserDefaults
来实现这个目的的好方法吗?我所看到的唯一的持久化方法是将其存档到本地文件中,但我的应用程序将所有东西都持久化在NSUserDefaults
中,并且如果可能的话,我想保持这样的方式。有可靠的方法以这种方式存储HKQueryAnchor
吗?
所以我有点沮丧,因为苹果用一个易于处理的透明的NSUInteger
替换了一个HKQueryAnchor
,但没有提供一种简单的方法来持久化这个HKQueryAnchor
。有人找到了使用NSUserDefaults
来实现这个目的的好方法吗?我所看到的唯一的持久化方法是将其存档到本地文件中,但我的应用程序将所有东西都持久化在NSUserDefaults
中,并且如果可能的话,我想保持这样的方式。有可靠的方法以这种方式存储HKQueryAnchor
吗?
NSKeyedArchiver
将其转换为NSData
并将其存储在用户默认设置中。NSData *data = [NSKeyedArchiver archivedDataWithRootObject:anchor];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"AnchorData"];
获取数据的方法:
NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"AnchorData"];
HKQueryAnchor *anchor = [NSKeyedUnarchiver unarchiveObjectWithData:data];
HKQueryAnchor
类基本上不符合NSCoding
协议... - holex你可以将锚点声明为一个计算属性,它使用NSKeyedUnarchiver
解码存储在NSUserDefaults
中的数据。
@AppStorage("anchorKey") private var encodedAnchor: Data?
private var myAnchor: HKQueryAnchor? {
if let encodedAnchor {
// Decode the data to get HKQueryAnchor
if let decodedAnchor = try? NSKeyedUnarchiver.unarchivedObject(ofClass: HKQueryAnchor.self, from: encodedAnchor){
return decodedAnchor
}
}
return nil
}
HKAnchoredObjectQuery
上,你可以使用闭包提供的NSKeyedArchiver
对新的锚点进行编码,然后将其存储到你的存储值中使用NSUserDefaults
。if let newEncodedAnchor = try? NSKeyedArchiver.archivedData(withRootObject: newAnchor, requiringSecureCoding: true) {
// Store the encoded anchor data in UserDefaults
self.myAnchor = newEncodedAnchor
}
requiringSecureCoding: false
设置为false? - mattrequireSecureCoding
最好设置为 true,因为 HKQueryObject 符合 NSSecureCoding 的要求。我会编辑答案。 - allmightu let anchorKey = "defaults-anchor-key"
var anchor: HKQueryAnchor? {
get {
guard let anchorData = UserDefaults.standard.data(forKey: anchorKey) else {
return nil
}
return try? NSKeyedUnarchiver.unarchivedObject(ofClass: HKQueryAnchor.self, from: anchorData)
}
set {
guard let newValue = newValue else {
UserDefaults.standard.set(nil, forKey: anchorKey)
return
}
if let anchorData = try? NSKeyedArchiver.archivedData(withRootObject: newValue, requiringSecureCoding: true) {
UserDefaults.standard.set(anchorData, forKey: anchorKey)
}
}
}
NSCoding
协议,然后您就可以随时对其进行归档或解档。 - holex