snapshot.exists()返回false时该怎么办?

时间:2017-03-19 21:26:15

标签: ios swift firebase firebase-realtime-database

我有一个存在的参考,我使用observeEventType来查询数据。但是由于用户删除了ref,因此ref可能没有数据。我用snapshot.exists()测试它。在下面的情况下,snapshot.exists()将返回false/no。因为它是假的我想做其他事情,但代码永远不会运行

当snapshot.exists()返回false / no时,我该怎么做呢?

     //there is no data at levelTwo so there's nothing to observe
let levelTwoRef = dbRef.child("players").child("uid").child("levelTwo")

levelTwoRef.observeEventType(.ChildAdded, withBlock: {
        (snapshot) in
        if snapshot.exists(){
           if let dict = snapshot.value as? [String:AnyObject]{
              let power = dict["power"] as? String
              let score = dict["score"] as? String
           }
        //this will never run because the data has been deleted
        } else{
          do something else as an alternative //why isn't this running??
        }
    })

enter image description here

2 个答案:

答案 0 :(得分:0)

您正在使用类型.ChildAdded在observeEventType中运行,它将返回创建的每个新路径的快照。如果您只需要使用observeSingleEventOfTypelink),并使用.Value作为事件类型,则只需要检索该值。

答案 1 :(得分:0)

Firebase有一个.hasChild函数,您可以在child上运行该函数以查看它是否存在:

func hasChild(_ childPathString: String) -> Bool

child作为String参数,并返回TrueFalse,具体取决于它是否存在。

检查孩子是否存在的方法是首先在孩子寻找之前设置孩子的路径。在问题的情况下,要查找的孩子是"levelTwo",之前的孩子是uid

 //there is no data at levelTwo so there's nothing to observe
let levelTwoRef = dbRef.child("players").child("uid").child("levelTwo")

假设你知道 uid ref 肯定存在,为uid ref设置一个常量而不是 levelTwo ref

// uid path definitely exists
let uidRef = dbRef.child("players").child("uid")

uid ref 上运行.value并在回调检查中查看 levelTwo ref 是否存在:

uidRef?.observeSingleEvent(of: .value, with: {
                (snapshot) in

                if snapshot.hasChild("levelTwo"){
                     // true -levelTwo ref Does exist so do something
                }else{
                    // false -levelTwo ref DOESN'T exist so do something else
                }
}