【问题标题】:How to map user data from Firestore如何从 Firestore 映射用户数据
【发布时间】:2022-10-23 23:05:24
【问题描述】:

我试图通过.map 获取用户的年龄和用户名,但它显示最后一个用户登录信息,而不是当前用户。

我很确定问题出在snapshot.data().map,但我不知道如何将其更改为当前用户。

func getData() {

        let db = FirebaseManager.shared.firestore
        
        guard let uid = FirebaseManager.shared.auth.currentUser?.uid
        else {
            self.errorMessage = "Could not find firebase uid"
            return
        }
        
        db.collection("user").document(uid).getDocument { snapshot, error in
            
            if error == nil {
                //No errors
                
                if let snapshot = snapshot {
                    
                    DispatchQueue.main.async { 

                        self.userInfo = snapshot.data().map { d in
                            
                            return UserInfo(age: d["age"] as? Int ?? 18, username: d["username"] as? String ?? "")
                        }
                    }
                }
            } else {
                self.errorMessage = "Uh Oh... Error"
            }
        }
    }

在视图中,我将其显示为:

Text("\(userMng.userInfo?.username ?? "NoUsername"), \(userMng.userInfo?.age ?? 18)")

【问题讨论】:

    标签: ios xcode firebase google-cloud-firestore swiftui


    【解决方案1】:

    要获取当前登录的用户数据,您将需要一个模型。

    模型示例:

    struct User{
        var uid: String 
        var name: String
        var surname: String
        var username: String
        var email: String
        var gender: String
        var age: Int
    
    }
    

    然后,您将需要一个 viewModel 将您的模型和视图连接在一起,在这里您将进行 firebase 调用。

    视图模型示例:

    import Foundation
    import FirebaseFirestore
    
    class SignedInUser: ObservableObject{
        
        private var auth = Auth.auth()
        private var db = Firestore.firestore()
        @Published var user: User?
        
        
        init(){
            fetchCurrentUser()
        }
        
        private func fetchCurrentUser(){
          
            guard let uid = auth.currentUser?.uid else {
                return
            }
    
            db.collection("users").document(uid).getDocument(completion: { (snapshot, error) in
                if let error = error{
                    print("Failed to fetch current user", error.localizedDescription)
                    return
                }
                
                guard let data = snapshot?.data() else{ return }
                
                let uid = data["uid"] as? String ?? ""
                let name = data["name"] as? String ?? ""
                let surname = data["surname"] as? String ?? ""
                let username = data["username"] as? String ?? ""
                let email = data["email"] as? String ?? ""
                let gender = data["gender"] as? String ?? ""
                let age = data["age"] as? Int ?? 0
                
                self.user = User(uid: uid, name: name, surname: surname, username: username, email: email, gender: gender, age: age)
    
                
                
            })
        }
       
    

    在那里,您将通过获取登录用户 uid 并在 firebase 中搜索来获取当前用户,然后您将检查错误,如果成功,您将调用数据的快照查询,当您拥有数据时,您将映射所有数据和将其设置为用户。

    然后,您可以在视图中使用该用户。

    视图示例:

    import SwiftUI
    import FirebaseAuth
    
    struct HomeScreenView: View {
        @ObservedObject private var vm = SignedInUser()
        var body: some View {
            ZStack{
                Color("BG")
                    .ignoresSafeArea()
                VStack{
                    Text("Current user: (vm.user?.name ?? "")")
                    Text("Home View")
                    Text("(Auth.auth().currentUser?.uid ?? "")")
                    Button(action: {
                        try? Auth.auth().signOut()
                    }, label: {
                        Text("Logout")
                    })
                }//VStack
            }//ZStack
    
            
        }
    }
    
    struct HomeScreenView_Previews: PreviewProvider {
        static var previews: some View {
            HomeScreenView()
        }
    }
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-06-07
      • 2022-01-01
      • 2019-07-03
      • 2021-10-27
      • 2018-06-13
      • 1970-01-01
      • 2022-08-04
      • 1970-01-01
      • 2021-02-07
      相关资源
      最近更新 更多