C'est ma première programmation à Swift / Swiftui et j'ai été bloqué avec une question depuis quelques semaines.
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>
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
}
}
3 Réponses :
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
Pour résoudre votre problème, vous pouvez essayer quelque chose comme ceci:
session.getResults() { // now do something with eventResults }
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.
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
Mais je devais modifier l'appel de la fonction à ce qui suit: P> session.getResults(completion: { message in
print(message)
// code execution here
})