我使用的是Firebase,我想查询是否存在某些内容。找到值时会调用它,但在找不到任何内容时不会调用该块。这是预期的行为吗?
ref.queryOrderedByKey().queryEqualToValue(channelName).observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in
print("found channel: \(snapshot.key)")
}, withCancelBlock: { error in
print(error.description)
})
我做错了吗?感谢
答案 0 :(得分:7)
要检查没有数据(快照== NULL),就这样做了
let refToCheck = myRootRef.childByAppendingPath(channelNameString)
refToCheck.observeEventType(.Value, withBlock: { snapshot in
if snapshot.value is NSNull {
print("snapshot was NULL")
} else {
print(snapshot)
}
})
与.observeEventType相比,查询非常繁重,并且由于您已经知道要检查的特定路径,因此它的性能会更好。
编辑:您也可以使用
if snapshot.exists() { ... }
当您想要检索包含特定值或一系列值的子节点时,最好使用Firebase查询。
编辑Firebase 3.x和Swift 3.x
let refToCheck = myRootRef.child(channelNameString)
refToCheck.observe(.value, with: { snapshot in
if snapshot.exists() {
print("found the node")
} else {
print("node doesn't exist")
}
})
注1)由于我们现在利用.exists测试是否存在快照,因此逻辑有所改变。 注2)此代码会使一个观察者在Firebase中处于活动状态,因此如果稍后创建该节点,它将会触发。
如果您想检查节点并且不想让观察者注意该节点,请执行以下操作:
let refToCheck = myRootRef.child(channelNameString)
refToCheck.observeSingleEvent(of: .value, with: { snapshot in
if snapshot.exists() {
print("found the node")
} else {
print("node doesn't exist")
}
})