Сохранить состояние в Userdefaults - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть класс, который сохраняет состояние чего-либо, в моем случае некоторую переменную 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 голосов
/ 13 декабря 2018

На мой взгляд, вернет кеш.Поскольку в официальной документации Apple указано, что

UserDefaults кэширует информацию, чтобы избежать необходимости открывать пользовательскую базу данных по умолчанию каждый раз, когда вам нужно значение по умолчанию

Может быть, вы можете изменить поток, когда сохранить данные.В своем коде покажите, что вы вызываете save () 3 раза в init ().

...