在Userdefaults中保存状态

时间:2018-12-13 16:37:59

标签: swift persistence codable userdefaults

我有一个保存状态的类,在我的情况下,该类保存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 个答案:

答案 0 :(得分:0)

我认为,它返回缓存。因为它在Apple official documentation中表示为

  

UserDefaults缓存信息,以避免每次需要默认值时都必须打开用户的默认数据库

也许可以更改流的保存时间。在代码中,表明您在init()中调用了save()3次。