在 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 中保存状态的主要内容,如果未能解决你的问题,请参考以下文章

在 Userdefaults 中保存状态

userdefaults 不保存按钮状态

如何使用 UserDefaults 保存已登录状态?

UserDefaults 不会在应用程序关闭并重新打开后保存数据

保存到 UserDefaults 被调用 19 次

错误:试图将堆栈放在不可读的内存中:0x7ffeeafe2af0:使用 userDefaults