如果存在不正常,Firebase Swift检查用户

时间:2017-11-28 23:38:08

标签: ios swift firebase firebase-realtime-database

我正在尝试检查我的数据库中是否存在用户,但无论用户是否存在,它总是会显示“成功”。我不太了解FireBase文档,它们非常糟糕,任何人都可以帮助我并告诉我为什么每次都能获得成功吗?

        if nickTextField.text != "" {

    let db = Database.database().reference()

        var userExistsSwitch = false
        db.child("Usernames").observe(.value, with: { (snapshot) in
            if snapshot.hasChild("\(self.nickTextField.text!)") {
                userExistsSwitch = true
                print("Username already exists!")
            }
        })

        db.child("Usernames").removeAllObservers()

        if !userExistsSwitch {
            print("Success!")
            db.child("Usernames").child(self.nickTextField.text!).setValue(self.nickTextField.text!)
        }

    }

1 个答案:

答案 0 :(得分:0)

从Firebase加载数据是异步发生的。这意味着打印成功的代码在数据实际加载之前运行。最简单的方法是使用一些好的位置日志语句:

let db = Database.database().reference()
print("Before attaching observer");
db.child("Usernames").observe(.value, with: { (snapshot) in
    print("Data has loaded");
})
print("After attaching observer");

运行此代码时,会打印:

  

在加入观察者之前

     

附上观察员后

     

已加载数据

无法改变此行为。它只是大多数现代网络的工作方式。

这意味着您必须将需要数据的任何代码放入完成处理程序,或者从完成侦听器中调用它。在您的情况下,这是一种简单的方法:

let db = Database.database().reference()

var userExistsSwitch = false
db.child("Usernames").observe(.value, with: { (snapshot) in
    db.child("Usernames").removeAllObservers()
    if snapshot.hasChild("\(self.nickTextField.text!)") {
        userExistsSwitch = true
        print("Username already exists!")
    }
    if !userExistsSwitch {
        print("Success!")
        db.child("Usernames").child(self.nickTextField.text!).setValue(self.nickTextField.text!)
    }
})