在 Userdefaults 中保存状态
Posted
技术标签:
【中文标题】在 Userdefaults 中保存状态【英文标题】:Save state in Userdefaults 【发布时间】:2018-12-13 16:37:59 【问题描述】:我有一个类可以保存某些东西的状态,在我的例子中是 ViewController 的一些变量,但有时它会加载错误或旧数据,但我不知道为什么。
也许有人可以看看我的代码,看看它是否有意义。
class TopFlopState: Codable, PersistenceState
var group: Groups = .large
didSet
save()
var base: Bases = .usd
didSet
save()
var valueOne: StatIntervalBaseModel = StatIntervalBaseModel(stat: "ppc", interval: "24h", base: "usd")
didSet
save()
init()
let savedValues = load()
if savedValues != nil
self.group = savedValues!.group
self.base = savedValues!.base
self.valueOne = savedValues!.valueOne
这是 PersistenceState 协议:
/**
Saves and Loads the class, enum etc. with UserDefaults.
Has to conform to Codable.
Uses as Key, the name of the class, enum etc.
*/
protocol PersistenceState
extension PersistenceState where Self: Codable
private var keyUserDefaults: String
return String(describing: self)
func save()
saveUserDefaults(withKey: keyUserDefaults, myType: self)
func load() -> Self?
return loadUserDefaults(withKey: keyUserDefaults)
private func saveUserDefaults<T: Codable>(withKey key: String, myType: T)
do
let data = try PropertyListEncoder().encode(myType)
UserDefaults.standard.set(data, forKey: key)
print("Saved for Key:", key)
catch
print("Save Failed")
private func loadUserDefaults<T: Codable>(withKey key: String) -> T?
guard let data = UserDefaults.standard.object(forKey: key) as? Data else return nil
do
let decoded = try PropertyListDecoder().decode(T.self, from: data)
return decoded
catch
print("Decoding failed for key", key)
return nil
如果一个值被设置为它应该自动保存的值,但就像我设置的那样,它有时会保存正确的值但加载错误的值...
【问题讨论】:
【参考方案1】:在我看来,它返回缓存。因为在Apple official documentation中,它声明了
UserDefaults 缓存信息以避免每次需要默认值时都必须打开用户的默认数据库
也许您可以更改流程,何时保存数据。在您的代码中显示您在 init() 中调用了 save() 3 次。
【讨论】:
初始化时不会调用didSet,所以我认为这不是问题所在。应用重启后缓存不会重置吗?感谢您的回答。有没有办法不返回缓存但总是返回保存的值? 我尝试将密钥设置为实际字符串,但没有解决问题 我也将它包裹在主线程上,就像这里描述的那样:***.com/questions/41302015/… 也没有帮助......你还有其他想法吗? ***.com/questions/21868315/nsuserdefaults-not-saving 也有可能是还没保存,那我做个测试吧。以上是关于在 Userdefaults 中保存状态的主要内容,如果未能解决你的问题,请参考以下文章