【问题标题】:SwiftUI - Show the data fetched from Firebase in view?SwiftUI - 在视图中显示从 Firebase 获取的数据?
【发布时间】:2021-06-16 02:20:04
【问题描述】:

Firebase 我试图在我的 SwiftUI 视图中显示从 Firestore 获取的数据,但我遇到了问题。我从 Firebase 中提取数据没有问题。但我无法按我的意愿显示数据。我使用 MVVM 架构。

我的模型是这样的:

struct UserProfileModel: Identifiable {

    @DocumentID var id : String?
    var username : String
    var uidFromFirebase : String
    var firstName : String
    var lastName : String
    var email : String

}

视图模型:

class UserProfileViewModel: ObservableObject {

    @Published var user : [UserProfileModel] = []

    private var db = Firestore.firestore()

    func data(){
        db.collection("Users").whereField("uuidFromFirebase", isEqualTo: Auth.auth().currentUser!.uid).addSnapshotListener { (snapshot, error) in
        guard let documents = snapshot?.documents else {
                print("No Documents")
            
                return
            }
        
            self.user = documents.compactMap { queryDocumentSnapshot -> UserProfileModel? in
            
                 return try? queryDocumentSnapshot.data(as: UserProfileModel.self)
             }
        }
    }
}

查看:

struct MainView: View {

    @ObservedObject private var viewModel = UserProfileViewModel()

    var body: some View { // -> Error: The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions
        VStack{
            Text(viewModel.user.username) // -> I want to do this but XCode is giving an error.

            // This works but I don't want to do it this way.
            List(viewModel.user) { user in
                        VStack{
                            Text(user.username)
                            Text(user.firstName)
                            Text(user.lastName)
                            Text(user.email)
                            Text(user.uidFromFirebase)
                        }
                    }
        }
    }
}

在我观看和阅读的标题为“SwiftUI fetch data from Firebase”的视频和文章中,我一直在 List 和 ForEach 上进行叙述。但我想在任何地方使用数据。我和你分享了我所有的代码。我想了解如何做到这一点。

【问题讨论】:

标签: swift xcode firebase mvvm swiftui


【解决方案1】:

在我看来,您真的只想拥有 一个 用户,您正在为其提取数据,但您已经为 UserProfileViewModel 设置了一组用户 ([UserProfileModel] )。有很多方法可以解决这个问题。这是一个(检查内联 cmets 的代码以了解发生了什么):

class UserProfileViewModel: ObservableObject {

    @Published var user : UserProfileModel? = nil // now an optional

    private var db = Firestore.firestore()

    func data(){
        db.collection("Users").whereField("uuidFromFirebase", isEqualTo: Auth.auth().currentUser!.uid).addSnapshotListener { (snapshot, error) in
        guard let documents = snapshot?.documents else {
                print("No Documents")
            
                return
            }
        
            self.user = documents.compactMap { queryDocumentSnapshot -> UserProfileModel? in
            
                 return try? queryDocumentSnapshot.data(as: UserProfileModel.self)
             }.first // Take the first document (since there probably should be only one anyway)
        }
    }
}
struct MainView: View {

    @ObservedObject private var viewModel = UserProfileViewModel()

    var body: some View {
        VStack {
          if let user = viewModel.user { //only display data if the user isn't nil
             Text(user.username)
             Text(user.firstName)
             Text(user.lastName)
             Text(user.email)
             Text(user.uidFromFirebase)
          }
        }
    }
}

我想说一种更传统的处理方式可能是存储您的用户个人资料文档Users/uid/——这样您就可以使用document(uid) 来查找它,而不是使用whereField 查询。

【讨论】:

  • 我解决了我的问题。非常感谢我的朋友!
猜你喜欢
  • 1970-01-01
  • 2021-09-26
  • 2021-01-05
  • 2021-04-04
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多