【发布时间】:2021-10-23 17:18:00
【问题描述】:
我的应用目前遇到问题。我将用户数据存储在 Firebase 中,当用户使用应用程序时,用户模型中的一些细节发生变化,用户被重定向到应用程序的根视图。我尝试创建一个可观察对象,但我认为我没有做得那么好。
目前,我获取用户的设置如下所示:
func fetchUsers(){
ref.child("users").observe(.childAdded) { (snapshot) in
guard let dictionary = snapshot.value as? [String: AnyObject] else { return}
var user = UserData()
user.email = (dictionary["email"] as! String)
user.name = (dictionary["name"] as! String)
user.firstname = (dictionary["firstname"] as! String)
user.lastname = (dictionary["lastname"] as! String)
user.type = (dictionary["type"] as! String)
user.uid = (dictionary["uid"] as! String)
user.profileImageUrl = (dictionary["profileImageUrl"] as! String)
user.id = snapshot.key
user.fcmToken2 = (dictionary["fcmToken"] as! String)
self.users.append(user)
}
}
内容视图:
struct ContentView: View {
@EnvironmentObject var session : SessionStore
@State var userState = UserData()
@State private var functionResult = false
func getUser(){
DispatchQueue.main.async {
session.listen()
session.getUserFromUID { (fetcheduser) in
DispatchQueue.main.async {
self.functionResult.toggle()
self.userState = fetcheduser
print("Auth State Changed")
print(functionResult)
}
}
}
}
var body: some View {
VStack{
if (session.session != nil) {
if(functionResult == true){
MainView(user: userState)
}
else {
DelayedLaunchScreen(user: userState)
}
}
else{
HomeView()
}
}.onAppear{
getUser()
}
}
}
主视图:
UIKitTabView {
CandidateListView().tab(title: "Kandidatai", image: "person.2")
ChatsView(session: self.session).tab(title: "Žinutės", image: "message")
ChatsHomeView(session: self.session, user: self.user).environmentObject(session).tab(title: "Darbo skelbimai", image: "newspaper")
ProfileMenuView(session: self.session, user: self.user).tab(title: "Paskywra", image: "person")
//CreateJobView(user: session.getUserFrom(uid: session.uid), session: self.session).tab(title: "Paskywra", image: "person")
}
我猜问题是,在 ContentView 中我有一个函数来获取用户数据并使用假的启动屏幕延迟它。我真的不明白,为什么在数据库更改后用户会弹出到根视图。这是因为用户是在 ContentView 中定义的吗?有没有其他方法可以在不引起问题的情况下做到这一点?任何想法为什么会发生这种情况?
谢谢大家!
【问题讨论】:
-
您可以编辑它以包含minimal reproducible example 吗?我可以自己用异步返回示例数据的东西替换 Firebase 部分,或者您也可以,但更重要的是,有必要查看这些部分如何组合在一起,以了解导致视图重新加载的原因。