我已实现登录,以便每次用户登录时都从实时数据库加载数据。当用户成功登录时,正在读取数据-问题是AppDelegate
更改了{ {1}}比读取数据快。因此,在再次关闭该应用程序之前,不会显示任何内容。
是否可以将视图更改延迟到读取数据之前?
ViewController
在didFinishLaunchingOptions()
内:
AppDelegate
let authListener = Auth.auth().addStateDidChangeListener { auth, user in
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if user != nil {
let controller = storyboard.instantiateViewController(withIdentifier: "RootPageViewController") as! RootPageViewController
self.window?.rootViewController = controller
self.window?.makeKeyAndVisible()
} else {
let vc = storyboard.instantiateViewController(withIdentifier: "SettingsTableViewController") as! SettingsTableViewController
vc.runResetData()
let controller = storyboard.instantiateViewController(withIdentifier: "ProfileViewController") as! ProfileViewController
self.window?.rootViewController = controller
self.window?.makeKeyAndVisible()
}
}
:
LoginViewController
答案 0 :(得分:2)
不,您不能这样做,因为监听调用是异步的,因此在设置rootVC时它会延迟运行,您需要显示一个类似
的加载器。 let vc = UIViewController()
vc.view.backgroundColor = .red
self.window?.rootViewController = vc
self.window?.makeKeyAndVisible()
let authListener = Auth.auth().addStateDidChangeListener { auth, user in
.....
}
在AppDelegate
内
if FIRAuth.auth().currentUser != nil {
// go to home , if you went before you should have km month values cached
}
else {
// go to login
}
答案 1 :(得分:0)
有可能将视图更改延迟到Firebase能够加载其数据之前:
databaseRef.observeSingleEvent
工作代码:
let authListener = Auth.auth().addStateDidChangeListener { auth, user in
let databaseRef = Database.database().reference()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if user != nil {
databaseRef.observeSingleEvent(of: .value, with: { snap in
let controller = storyboard.instantiateViewController(withIdentifier: "RootPageViewController") as! RootPageViewController
self.window?.rootViewController = controller
self.window?.makeKeyAndVisible()
})
} else {
let vc = storyboard.instantiateViewController(withIdentifier: "SettingsTableViewController") as! SettingsTableViewController
vc.runResetData()
let controller = storyboard.instantiateViewController(withIdentifier: "ProfileViewController") as! ProfileViewController
self.window?.rootViewController = controller
self.window?.makeKeyAndVisible()
}
}