Swift Firebase 4.0 - observeSingleEvent不返回数据集(但身份验证正在运行)

时间:2017-10-04 01:55:36

标签: swift firebase firebase-realtime-database firebase-authentication

我在过去的12个月里一直在Android上使用Firebase,并取得了成功。我刚刚切换到Swift,并尝试从我创建的同一个Firebase数据库中读取数据并使用过去12个月+。由于FB DB有安全性,我做的第一件事就是让FB身份验证(来自Swift)工作。这有效。现在,我试图让一个简单的observeSingleEvent运作起来并且正在努力。

Firebase数据库是旧的东西。它有一个root用户节点。对于初学者,我只想从用户节点读取用户。我知道身份验证正在运行,因为当我提交电子邮件和密码时,我会收到确认。当电子邮件/密码错误时,我不会得到确认。鉴于这验证了我与数据库的连接,并作为测试我在登录验证后立即粘贴了以下代码。

当我调试它时,它只是从“self.ref?.child(”users“)。observeSingleEvent ...”跳到下面的括号。即它从未承认有可用数据,但有数据可用。

为避免有人问“你需要什么?”我正在寻找的是为什么我没有收到下面代码的数据结果集的答案,因为FB DB中有数据,而且我在过去12个多月里一直在Android上读/写这些数据。

欢迎任何/所有帮助,因为我在Swift / FB 4.0上切割了

@IBAction func signInButtonTapped(_ sender: UIButton) {

    // TODO: Do some form validation on the email and password

    if let email = emailTextField.text, let pass = passwordTextField.text {

        // Check if it's sign in or register
        if isSignIn {
            // Sign in the user with Firebase
            Auth.auth().signIn(withEmail: email, password: pass, completion: { (user, error) in

                // Check that user isn't nil
                if let u = user {
                    // User is found, go to home screen

                    self.ref = Database.database().reference()
                    self.ref?.child("users").observeSingleEvent(of: .value, with: {( snapshot) in
                        let value = snapshot.value as? NSDictionary
                        let username = value?["username"] as? String ?? ""
                        print ("***   " + username)

                    })           
                }
                else {
                    // Error: check error and show message
                }

            })

        }

1 个答案:

答案 0 :(得分:1)

由于observeSingleEvent是一个异步调用,因此它在后台线程上运行,这就是为什么当你在self.ref上放置一个断点时它跳转到下一个括号,因为它没有阻止当前的执行线程,并且在后台线程上执行一段时间

一种方法是:

@IBAction func signInButtonTapped(_ sender: UIButton) {

    // TODO: Do some form validation on the email and password

    if let email = emailTextField.text, let pass = passwordTextField.text {

        // Check if it's sign in or register
        if isSignIn {
            // Sign in the user with Firebase
            Auth.auth().signIn(withEmail: email, password: pass, completion: { (user, error) in

                // Check that user isn't nil
                if let u = user {
                    // User is found, go to home screen

                    self.fetchUserName { fetchedUserName in
                        print(fetchedUserName)

                    }        
                }
                else {
                    // Error: check error and show message
                }

            })

        }

func fetchUserName(completionHandler: @escaping (String) -> Void) {


      self.ref = Database.database().reference()
      self.ref?.child("users").observeSingleEvent(of: .value, with: {( snapshot) in
            //let value = snapshot.value as? NSDictionary
            if let value = snapshot.value as? [String: Any] {
                  print(value)
                  let username = value["username"] as? String ?? ""

                  print (username)
                  completionHandler(username)

            }

      })


}