web-dev-qa-db-fra.com

UserDefaults n'est pas enregistré avec Swift 3

J'essaie d'utiliser les UserDefaults pour enregistrer de manière persistante une valeur booléenne. Voici mon code:

public static var isOffline = UserDefaults.standard.bool(forKey: "isOffline") {
        didSet {
            print("Saving isOffline flag which is now \(isOffline)")
            UserDefaults.standard.set(isOffline, forKey: "isOffline")
            UserDefaults.standard.synchronize()
        }
    }

Pourquoi ça ne marche pas? Quel est le problème dans ce code?

EDIT: Le problème est que lorsque j'essaie de récupérer "isOffline" clé de UserDefaults J'obtiens toujours un false.

EDIT 2: J'ai défini l'isOffline dans la méthode .onChange de la ligne (j'utilise Eureka comme framework pour créer des formulaires). Le drapeau conserve la bonne valeur pendant le cycle de vie de l'application, mais quand je le ferme, cette valeur est probablement supprimée d'une manière ou d'une autre.

13
Andrea Mario Lufino

J'ai eu le même problème et le problème était dans le bloc "didSet" lui-même. Je ne sais pas pourquoi, mais cela ne fonctionne pas avec userDefaults - il ne persiste pas correctement et après avoir tué l'application, toutes les modifications ont disparu.

Synchronize () n'aide pas. J'ai découvert que cette méthode n'est plus nécessaire et qu'elle sera obsolète à l'avenir (c'est un commentaire dans la classe UserDefaults):

-synchronize est obsolète et sera marqué avec la macro NS_DEPRECATED dans une prochaine version.

Par essais et erreurs, j'ai découvert que cela fonctionne, si je l'appelle à partir du thread principal:

public static var isOffline = UserDefaults.standard.bool(forKey: "isOffline") {
        didSet {
            print("Saving isOffline flag which is now \(isOffline)")
            DispatchQueue.main.async {
                    UserDefaults.standard.set(isOffline, forKey: "isOffline")
                }

        }
    }

Si quelqu'un peut expliquer pourquoi cela fonctionne sur le fil principal et aucun autre, je serais heureux de l'entendre.

20
Vojtech Kubat

Fait comme ça,

public static var isOffline:Bool {
    get {
       return UserDefaults.standard.bool(forKey: "isOffline")
    }
    set(newValue) {
        print("Saving isOffline flag which is now \(isOffline)")
        UserDefaults.standard.set(newValue, forKey: "isOffline")
        UserDefaults.standard.synchronize()
    }
}
2
Venk

essayer de changer

UserDefaults.standard.set(isOffline, forKey: "isOffline")

à

UserDefaults.standard.setValue(isOffline, forKey: "isOffline")

sans le code d'expédition

1
Omar N Shamali