【发布时间】:2021-09-07 22:20:44
【问题描述】:
我有一个带有名为 userData 的 @Published 变量的类。当在此类中调用函数 fbLogic.getUserData() 时,它会使用从对 Firestore 数据库的调用中填充的数据更新 userData 数组。
问题是这个发布的变量在访问它的视图中没有更新。或者更重要的是,这些函数不会等到 Firestore 调用完成后才访问变量。所以 BarGraphView() 是用空的 reports[] 数组调用的,并且这个数组不会被 convertToReports() 调用更新,因为 convertToReports() 是用一个空的 userData 数组调用的,因为 fbLogic.getUserData() 还没有完成检索Firebase 数据。希望代码能更好地解释它。
这是引用数组的视图。
struct StatsView: View {
let ID: String;
@EnvironmentObject var statsController: StatsDataController
@State var reports: [Report] = [Report]();
@Binding var fbLogic: FirebaseLogic
var body: some View {
BarGraphView(selection: $selection, reports: $reports, originalReports: $originalReports).environmentObject(statsController).onAppear{
fbLogic.userData = fbLogic.getUserData(uid: ID); //supposed to update the userData @Published var
//These are called before fbLogic.userData has even been updated !!!
self.reports = statsController.convertToReports(users: fbLogic.userData);
print("fblogic data ", fbLogic.userData, " ", ID);};
}
此视图在对 .getUserData() 的调用完成之前打印出“fb logic data []”,因此对 convertToReports() 的调用发生在一个空数组,而不是填充数组。
请问,我如何让该视图识别 fbLogic.userData @Pubished 数组已更新并调用 convertToReports(),并使用 POPULATED 数组重新绘制 BarGraphView。
这是 fbLogic 类的一部分,因此您可以理解对 firebase 的调用:
class FirebaseLogic: ObservableObject {
@Published var userData = [UserData]()
func getUserData(uid: String) -> [UserData]{
let db = Firestore.firestore()
userData = [UserData]()
let auth = Auth.auth();
let currentUser = (auth.currentUser?.uid)!
let data = db.collection("UserData").document(currentUser).collection("Data") .getDocuments { [self] (snapshot, error) in
guard let snapshot = snapshot, error == nil else {
return
}
print("Number of documents fb logic get user data: \(snapshot.documents.count ?? -1)")
snapshot.documents.forEach({ (documentSnapshot) in
let documentData = documentSnapshot.data()
//CONVERT TO userObject here (removed for simplicity)
userData.append(userObject)
})
}
return userData
}
【问题讨论】:
-
你可以试试“@ObservedObject var fbLogic: FirebaseLogic”而不是“@Binding var fbLogic: FirebaseLogic”
-
@workingdog 不幸的是这并没有改变行为:(
-
UserData 是结构体还是类?
标签: firebase google-cloud-firestore swiftui