【问题标题】:Swift Firebase 4.0 - observeSingleEvent not returning data set (but authentication is working)Swift Firebase 4.0 - observeSingleEvent 不返回数据集(但身份验证正在工作)
【发布时间】:2017-10-04 01:55:35
【问题描述】:

过去 12 个月以来,我一直在 Android 上使用 Firebase,并取得了成功。我刚刚切换到 Swift,并试图从我创建的同一个 Firebase 数据库中读取数据,并且在过去 12 个月内一直在使用。由于 FB DB 应用了安全性,我做的第一件事就是让 FB 身份验证(来自 Swift)工作。这行得通。现在,我正在尝试让一个简单的 observeSingleEvent 可操作并且正在苦苦挣扎。

Firebase 数据库还是老样子。它有一个脱离根的用户节点。对于初学者,我只想从用户节点读取用户。我知道身份验证有效,因为当我提交电子邮件和密码时,我会收到确认。当电子邮件/密码错误时,我没有得到确认。鉴于这验证了我与数据库的连接,并且作为测试,我在登录验证后立即插入了以下代码。

当我调试它时,它只是从 "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
                }

            })

        }

【问题讨论】:

  • print(username) 不执行?
  • 谢谢 - 它编译没有错误。然后我可以运行它。鉴于我从未收到 print 语句的任何输出,我在“self.ref?”处设置了一个断点...它到达那里并跳到下一个括号。
  • 好的,请尝试在print(username) 之后添加print("inside ref"),然后在没有任何断点的情况下运行程序,看看它是否打印
  • 好的,因为observeSingleEvent是一个异步调用,所以它在后台线程上运行,这就是为什么当你在self.ref上设置断点时它会跳到下一个括号,因为它不会阻塞当前的执行线程,并且会在后台线程的某个时间后执行
  • 请添加print("Snapshot : \(snapshot)"),看看你从数据库中得到了什么

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


【解决方案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)

            }

      })


}

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多