Firebase和Swift-延迟更改ViewController,直到读取数据

时间:2019-05-03 18:33:05

标签: ios swift firebase

我已实现登录,以便每次用户登录时都从实时数据库加载数据。当用户成功登录时,正在读取数据-问题是AppDelegate更改了{ {1}}比读取数据快。因此,在再次关闭该应用程序之前,不会显示任何内容。

是否可以将视图更改延迟到读取数据之前?

ViewControllerdidFinishLaunchingOptions()内:

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

2 个答案:

答案 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()
            }

        }