Mise a jour de l'observable qui ne se fait pas avec fireBase

Bonsoir
J’ai un petit souci avec un observable qui ne se mais pas à jour.
J’ai une classe qui est ActivityModelFirebase qui est observable avec une variable qui est Published
class ActivityModelFirebase

class ActivityModelFirebase: ObservableObject {
    var ref = Database.database().reference()
    @Published var activities: [ActivityModel] = []
    
    func getActivities() {
        
            self.ref.child("Activities").observeSingleEvent(of: .value) { (snapshot) in
                //guard snapshot as! DataSnapshot != "NSNull" else { return }
                
                for activity in snapshot.children {
                      let activitySnapshot = activity as! DataSnapshot

                    let activityArrayData = activitySnapshot.value as? [String:AnyObject]
                    
                    self.activities.append( ActivityModel(another: activityArrayData?["another"] as! String, bannerpic: activityArrayData?["bannerpic"] as! String, date: activityArrayData?["date"] as! String, heading: activityArrayData?["heading"] as! String, pdflink: activityArrayData?["pdflink"] as! String, simpletext: activityArrayData?["simpletext"] as! String, someother: activityArrayData?["someother"] as! String))

                }
                // ici j'ai bien des data.
                print(self.activities[0].heading)
            }
    }

}

Le print me retourne bien un objet donc cette partie fonctionne.

class ActivityModel ( qui mon objet de data)

class ActivityModel: Identifiable {
    var id = UUID().uuidString
    private var _another: String = ""
    private var _bannerpic: String = ""
    private var _date: String = ""
    private var _heading: String = ""
    private var _pdflink: String = ""
    private var _simpletext: String = ""
    private var _someother: String = ""
    
    
    init(another: String, bannerpic: String, date: String, heading: String, pdflink: String, simpletext: String, someother: String ) {
        self._another = another
        self._bannerpic = bannerpic
        self._date = date
        self._heading = heading
        self._pdflink = pdflink
        self._simpletext = simpletext
        self._someother = someother
    }
    
    var heading: String{
        get {
            return self._heading
        }
    }
}

ma view ou je dois utilisé les datas

struct NewView: View {
    @State var showSetting = false
    //MARK: Properties
    @ObservedObject var session = ActivityModelFirebase()
    
    var body: some View {
        NavigationView{
            ScrollView {
                
                Button(action: {
                    //pour mon test 
                    // ici il me retourne 0
                    print(session.activities.count)
                }, label: {
                    Text("test")
                })
                ListRowView()
               
            }
            
            .navigationTitle("Actus")
                .navigationBarItems(trailing: Button(action: {
                    self.showSetting.toggle()
                }, label: {
                    Image(systemName: "slider.horizontal.3")
                        .foregroundColor(.black)
                        .font(Font.system(size: 30))
                    
                }).fullScreenCover(isPresented: $showSetting, content: {
                    SettingView()
                }))
        }.onAppear(perform: {
             // le init 
            getActivities()
        })
    }
    func getActivities() {
        // je remplir pour avoir accès a mes datas
        ActivityModelFirebase().getActivities()
    }
}

Quand je fait un print(session.activities.count) il me retoune 0 donc je ne sais pas ou j’ai merdé lol .

Merci d’avance.

Hello,

Est-ce que ce n’est pas une histoire d’asynchronisation entre ton appel à Firebase et ton print ?
Je m’explique : il est probable que ton print s’exécute plus tôt que tout ton appel Firebase, qui est asynchrone et qui te retourne la ou les valeurs quand il a terminé, et donc le print te retourne 0 parce qu’il n’a pas eu le temps de récupérer ce que tu lui demandes.

@schtipoun donc il faudrais que j’utilise de un DispatchQueue dans ma fonction ou il y a firebase ?

Finalement j’ai crée une fonction init et dedans je lance ma fonction de getActivities.
Mais il y a peut être mieux comme solution?

Oui, il faudrait le faire via un DispatchQueue mais tout dépend de ce que tu attends des résultats : est-ce que ça conditionne de l’UI ou est-ce que c’est juste une tâche de calcul de fond ?
Désolé, mais comme je n’ai pas encore touché à SwiftUI, j’ai un peu de mal à lire ton code avec les Identifiable et ObservableObject. J’en suis resté à UIKit pour ma part :sweat_smile:

Pas de souci , :slight_smile: oui c’est pour alimenter une scrollview :slight_smile: ObservableObject émet la valeur modifiée avant que l’une de ses propriétés @Published une des propriéte change.