I want to implement a Text field that displays the current user's existing score in the DB (Firestore). Because of the nature of async in Firebase query, I also need to do some adjustment in my codes. However, it seems that completion() handler does not work well:
// ViewModel.swift import Foundation import Firebase import FirebaseFirestore class UserViewModel: ObservableObject { let current_user_id = Auth.auth().currentUser!.uid private var db = Firestore.firestore() @Published var xp:Int? func fetchData(completion: @escaping () -> Void) { let docRef = db.collection("users").document(current_user_id) docRef.getDocument { snapshot, error in print(error ?? "No error.") self.xp = 0 guard let snapshot = snapshot else { completion() return } self.xp = (snapshot.data()!["xp"] as! Int) completion() } } } // View.swift import SwiftUI import CoreData import Firebase { @ObservedObject private var users = UserViewModel() var body: some View { VStack { HStack { // ... Text("xp: \(users.xp ?? 0)") // Text("xp: 1500") .fontWeight(.bold) .padding(.horizontal) .foregroundColor(Color.white) .background(Color("Black")) .clipShape(CustomCorner(corners: [.bottomLeft, .bottomRight, .topRight, .topLeft], size: 3)) .padding(.trailing) } .padding(.top) .onAppear() { self.users.fetchData() } // ... } } My result kept showing 0 in Text("xp: \(users.xp ?? 0)"), which represents that the step is yet to be async'ed. So what can I do to resolve it?
fetchDatais called. Also, are you sure thatself.xpis getting assigned? Have you set break points or print statements to make sure you're getting the value you expect?self.xp