@Published et environmentObject

Bonjour tout le monde,
Je rencontre une difficulté concernant la sauvegarde d’un environmentObject :

j’ai une class Observable:

**class** ClassTest: ObservableObject {

@Published **var** testtId: UUID?

}

La variable est optionnelle car aucun Id la première fois que l’application est lancée.

J’initialise la variable par l’id des objets que je sélectionne dans l’application, et cela me permet de changer la vue en fonction. Jusque là pas de soucis.
Mais bien entendu lorsque je quitte et relance l’application la variable retourne à nil.

J’aimerai sauvegarder la variable dans les userDefaults avec le dernier UUID sélectionné pour une certaine persistence et donc pouvoir présenter le dernier objet dans ma vue.
Si quelqu’un à une idée je suis preneur :relaxed:.

Bonjour,

Maxime en parle à différents endroits dans ses cours. Tu n’es pas tombé dessus ?

Sinon, tu as un exemple à l’adresse suivante, qui va te montrer comment faire.
https://www.hackingwithswift.com/books/ios-swiftui/storing-user-settings-with-userdefaults

Concernant les userDefaults? Oui dans les cours je suis tombé dessus, mais là le soucis c’est pour sauvegarder l’environmentObject. (Je ne sais même pas si je peux d’ailleurs), parce que si je passe ne serait ce par un AppStorage je devrai passer des Binding à toutes mes vues si je ne m’abuse, d’où mon utilisation du environmentObject.

J’ai même lu que l’on pouvait passer le AppStorage dans l’environnement directement, mais pas trop compris le principe.

Arf, au départ ta question est simple, et je pense que le lien que je t’ai donné répond à la question. Mais là tu me perds :slight_smile: , tu pars sur d’autres sujets…
Du coup, faut peut être en revenir à quel est ton besoin, et ce que tu as produit pour le moment correspond t’il au besoin. Mais je ne sais pas ce que tu manipules comme données. Il y a plein de façons de stocker des données.

J’ai du me perdre dans mes explications :sweat_smile:
En gros je souhaites sauvegarder le Published de ma classe dans les UserDefaults.
Pour que lorsque j’appelle le @published a l’aide de environmentObject la variable se sauvegarde automatiquement.
Du coup ma question est : peut on sauvegarder une variable @Published dans UserDefaults?

Bonjour,

Je vois deux pistes:

  • un DidSet associé à ta variable @Published (je n’ai pas testé si c’est compatible); dans ce didSet, tu sauves la valeur dans le UserDefault. Même si cette méthode fonctionne, elle ne me semble pas très optimisée, parce que tu vas sauvegarder la variable en userDefault à chaque modification, alors que, visiblement, seule la dernière modification t’intéresse
  • au moment où l’application passe en background, et à ce moment là seulement, tu sauvegardes la variable dans le UserDefault

Cordialement,
Nicolas

C’est peut être juste un problème de vocabulaire, mais tu ne peux pas sauvegarder une donnée de ta Classe. J’imagine que tu voulais dire sauvegarder l’ID de l’instance d’un objet de Classe « ta classe ».
Dans Userdefaults tu peux sauvegarder le contenu d’une variable. L’intérêt qu’il y a à ce que ta donnée soit published, c’est de prévenir les View. Vis à vis de la sauvegarder, il n’y a pas d’intérêt.

@ristretto , je pense être plutôt intéressé par la première solution car mon intérêt serait d’avoir un affichage dynamique en fonction de l’UUID sélectionné, je n’ai pas encore eu le temps d’essayer mais je pense qu’avec le didSet cela fonctionne comme détaillé dans cet article:
Making changes permanent with UserDefaults - a free Hacking with iOS: SwiftUI Edition tutorial

@sylvain oui je pense m’être encore mal exprimé, mais je pense qu’avec la solution décrite en haut ça correspondrait à mon problème car à l’init je récupère la valeur, et ce que je voulais essayer de faire (d’une pierre deux coups disons :sweat_smile:) ou sinon il faut que je stocke ma valeur qui est dans le @main
@StateObject **var** classTest = ClassTest()

dans les Userdeafaults, ce qui reviendrait au même si je ne m’abuse.