0
votes

Initialiser les variables avec des données de Firebase sur l'application SWIFTUI

C'est ma première programmation à Swift / Swiftui et j'ai été bloqué avec une question depuis quelques semaines.

l'application forte> J'essaie de créer une application dans laquelle les utilisateurs entrent des données pour un jeu, ces données sont stockées sur leur téléphone et une fois que les réponses sont disponibles dans une base de données FireBase, elle comparera contre eux et calculera un score. P>

Jusqu'à présent, j'ai pu: - Intégrer Firebase dans l'application iOS - J'ai pu exécuter des listes / des boucles forestières sur les informations recueillies à partir de la base de données p>

au moment où mon problème est le suivant: J'essaie de charger les informations de FireBase, puis utilisez ces informations pour comparer les données utilisateur et calculer un score. Lorsque je fais cela, la fonction qui renvoie les données de Firebase renvoie un tableau vide. p>

Firebase Résultats de la fonction STRT> P>

import SwiftUI
import CoreData

struct EventList : View {

    @Environment(\.managedObjectContext) var managedObjectContext
    @ObservedObject var session = FirebaseSession()

    @FetchRequest(entity: UserEvents.entity(),
                  sortDescriptors: [])

    var userEvents: FetchedResults<UserEvents>

    var body: some View {

        ZStack {
            Color.init(red: 221/255, green: 221/255, blue: 221/255)
                .edgesIgnoringSafeArea(.all)
            VStack {
                ScrollView {
                    VStack(alignment: .leading) {
                        ForEach(userEvents) { eventVar in
                                EventCard(eventVar: eventVar)
                                    .cornerRadius(0)
                                    .shadow(color: .black, radius: 5, x: 2, y: 2.0)
                                    .padding(.horizontal)
                                    .frame(width: UIScreen.main.bounds.width)
                        }
                    }
                }
            }
        }.onAppear{
            self.getFirebaseData()
            var testvar2 = self.session.eventResults // is empty
            self.calcScores(resultlist: self.session.eventResults)
        }
    }

    //MARK: calculate Scores

    func getFirebaseData() {
        session.getResults()
    }



    func calcScores(resultlist: [EventResults]) {
          var testcount = resultlist.count // is empty

        }
}


0 commentaires

3 Réponses :


0
votes

Le problème que je le vois, est en cas de liste (et partout ailleurs) que vous appelez self.getfirebasedata () qui appelle GetResults () et c'est un appel asynchrone. Vous devez attendre jusqu'à ce qu'il soit terminé avant de pouvoir avoir:

var testvar2 = self.session.eventResults


0 commentaires

0
votes

Pour résoudre votre problème, vous pouvez essayer quelque chose comme ceci:

session.getResults() {
    // now do something with eventResults
}


3 commentaires

Merci! Je vais essayer cela pour voir si cela résout mon problème sera de retour avec une réponse.


Donc cela a été partiellement travaillé. La fonction renvoie maintenant une valeur et me permet d'utiliser pour les calculs, mais il ne stocke que la première valeur du tableau / dictionnaire.


J'ai réalisé que les appels d'achèvement () n'étaient pas au bon endroit peu après que j'ai posté. Quoi qu'il en soit, je suis content que vous l'iez au travail.



1
votes

Basé sur l'entrée de WorkingDog, j'ai pu obtenir le code de travailler avec une variation mineure de l'appel de la fonction

Fonction de résultats forte> p> xxx pré >

Mais je devais modifier l'appel de la fonction à ce qui suit: P>

       session.getResults(completion: { message in
               print(message)
// code execution here
        })


0 commentaires