【问题标题】:Firestore not returning data to @Published variableFirestore 不将数据返回到@Published 变量
【发布时间】:2023-01-10 12:34:26
【问题描述】:

我打电话给 Firestore 获取一些数据并存储到

@published var userJournals

在另一个视图中,我去调用变量,它是空的。我检查了从 firestore 初始提取的数据,数据显示并成功映射。想知道我在另一种观点上做错了什么。

视图 1

class JournalDashLogic: ObservableObject {
    @Published var userJournals = [UserJournalEntry]()
    @Published var userJournalIDs = [String]()

func grabUserJournals(journalID: String){
        //grab current user
         guard let uid = FirebaseManager.shared.auth.currentUser?.uid else {
             return
         }
         FirebaseManager.shared.firestore
             .collection("users")
             .document(uid)
             .collection("userJournalEntrys")
             .document(journalID)
             .collection("items")
             .addSnapshotListener { (snapshot, err) in
                 guard let documents = snapshot?.documents else{
                     print("no documents present")
                     return
                 }
                 //map to journal entry struct
                     self.userJournals = documents.map { (querySnapshot) -> UserJournalEntry in
                     let data = querySnapshot.data()
                     let dateCreated = data ["dateCreated"] as? String ?? ""
                         let dayOfWeek = data ["dayOfWeek"] as? String ?? ""
                         let mealCalories = data ["mealCalories"] as? Int ?? 0
                         let mealCarbs = data ["mealCarbs"] as? Int ?? 0
                         let mealFat = data ["mealFat"] as? Int ?? 0
                         let mealName = data ["mealName"] as? String ?? ""
                         let mealProtein = data ["mealProtein"] as? Int ?? 0
                         let MealServing = data ["MealServing"] as? Int ?? 0
                         let mealSaved = data ["saved"] as? Bool ?? false
                         let mealTiming = data ["timeCreated"] as? String ?? ""
                    
                         let entry = UserJournalEntry(id: UUID().uuidString, mealName: mealName, mealFat: mealFat, mealCarbs: mealCarbs, mealProtein: mealProtein, mealCalories: mealCalories, MealServing: MealServing, mealSaved: mealSaved, mealTiming: mealTiming, dayOfWeek: dayOfWeek, totalCalories: "100", dateCreated: dateCreated)
                   
                     return entry
                     
                 }
                 
             }

视图 2

  .onAppear {
              
                for id in jm.userJournalIDs {
                        jm.grabUserJournals(journalID: id)
                    }
                
            }

 

从视图 2 呈现的工作表

 .sheet(isPresented: $showAllJournals){
            SavedJournalsList(savedJournalIDs: jm.userJournalIDs, savedJournals: jm.userJournals)
                .transition(transition)
                
        }

视图 3

 struct SavedJournalsList: View {
        @State var savedJournalIDs: [String]
        @State var savedJournals: [UserJournalEntry]
     
        var body: some View {
            VStack (alignment: .leading){
            ForEach(savedJournals, id: \.self) { entry in
              
                    HStack{
                        Text(entry.dateCreated).bold()
                        Text("Total Calories: 3200")
                    .padding(.leading, 15)
                    }
                    .frame(maxWidth: .infinity)
                    .multilineTextAlignment(.center)
                            HStack{
                                Text("200 Carbs")
                                    .foregroundColor(.gray)
                                Text("250 Protein")
                                    .foregroundColor(.gray)
                                Text("100 Fat")
                                    .foregroundColor(.gray)
                            }
                            .padding(.all, 5)
                            .frame(maxWidth: .infinity)
                       
                    }
             
                .frame(width: 300, height: 100)
                .background(.white)
                .cornerRadius(15)
                .shadow(color: Color("LighterGray"), radius: 5, x: 0, y: 8)
                
            }
            
        }
    }

【问题讨论】:

  • Wondering what I'm doing wrong on the other view.。如何显示 View1 和 View2 的代码,如何声明它们以及如何在它们之间传递 JournalDashLogic。请注意,您可能应该使用@StateObject var jm = JournalDashLogic()。请注意,在您的代码中,您设置了userJournals,而不是您在 view2 中使用的userJournalIDs
  • @workingdogsupportUkraine 已更新以包含更多信息。谢谢!

标签: swift firebase google-cloud-firestore swiftui


【解决方案1】:

您可以尝试我为我的项目创建的这个功能

func lisentDocument<T:Codable>(docPath: String, model: T.Type, completion:@escaping(T?,String?) -> Void) -> ListenerRegistration? {
        let docRef = db.document(docPath)
        var listner: ListenerRegistration? = nil
        listner = docRef.addSnapshotListener { response, error in
            if error != nil {
                completion(nil, error?.localizedDescription)
                print(listner)
            }
            do {
                let data = try response?.data(as: model)
                completion(data, nil)
            } catch {
                completion(nil, FBError.someThingWentWrong.message)
            }
        }
        
        return listner
    }

如何使用

lisentDocument(docPath: "Doc Path", model: [UserJournalEntry].self,
                                          completion: { data, error in
        self.userJournals = data
    })

如果你有对象作为响应使用可以使用模型作为 UserJournalEntry.self

【讨论】:

    猜你喜欢
    • 2021-03-17
    • 2020-10-24
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多