我有一个存在的参考,我使用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??
}
})
答案 0 :(得分:0)
您正在使用类型.ChildAdded
在observeEventType中运行,它将返回创建的每个新路径的快照。如果您只需要使用observeSingleEventOfType
(link),并使用.Value
作为事件类型,则只需要检索该值。
答案 1 :(得分:0)
Firebase有一个.hasChild
函数,您可以在child
上运行该函数以查看它是否存在:
func hasChild(_ childPathString: String) -> Bool
child
作为String
参数,并返回True
或False
,具体取决于它是否存在。
检查孩子是否存在的方法是首先在孩子寻找之前设置孩子的路径。在问题的情况下,要查找的孩子是"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
}
}