首页 > 解决方案 > 为什么我的 swift 代码出现故障?

问题描述

我有以下代码,它似乎执行无序。

var theauth = 0
        ref = Database.database().reference()
        let usersRef = ref?.child("Users")
        let queryRef = usersRef?.queryOrdered(byChild: "username").queryEqual(toValue: emailTextField.text!)
        queryRef?.observeSingleEvent(of: .value, with: { (snapshot) in
            for snap in snapshot.children {
                let userSnap = snap as! DataSnapshot
                let thechild = userSnap.key
                print(thechild + "Hi")
                if thechild != ""{
                    theauth = 3
                    print(thechild + "1")
                }else if self.password2.text == self.passwordTextField.text{
                    theauth = 1
                }else{
                    theauth = 2}
            }
        })

        print(theauth)

输出打印的顺序与我预期的相反:

0 //theauth value
-Lf9xUh53VeL4OLlwqQoHi //thechild value + Hi
-Lf9xUh53VeL4OLlwqQo1  //thechild value + 1

想法???

标签: swiftfirebasefirebase-realtime-database

解决方案


查询是异步的,运行时间比最后的打印语句要长。考虑在设置变量时添加打印语句,或者在查询完成时调用方法来执行该打印语句。

var theauth = 0
ref = Database.database().reference()
let usersRef = ref ? .child("Users")
let queryRef = usersRef ? .queryOrdered(byChild: "username").queryEqual(toValue: emailTextField.text!)
queryRef ? .observeSingleEvent( of: .value, with: {
  (snapshot) in
  for snap in snapshot.children {
    let userSnap = snap as!DataSnapshot
    let thechild = userSnap.key
    print(thechild + "Hi")
    if thechild != "" {
      theauth = 3
      print(thechild + "1")
    } else if self.password2.text == self.passwordTextField.text {
      theauth = 1
    } else {
      theauth = 2
    }
  }
  print(theauth)
})

推荐阅读