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)
}
}
}
}
View:
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 从 Firebase 获取数据”的视频和文章中,我总是对 List 和 ForEach 进行叙述。但我想在任何地方使用这些数据。我与你分享了我所有的代码。我想了解如何做到这一点。
在我看来你真的只是想拥有one您正在为其提取数据的用户,但您已经设置了UserProfileViewModel
与一组用户([UserProfileModel]
)。有多种方法可以解决这个问题。这是一个(检查代码以获取有关正在发生的事情的内联注释):
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
query.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)