当没有结果时,Firebase查询不会调用阻止

时间:2016-01-03 14:39:35

标签: ios swift firebase

我使用的是Firebase,我想查询是否存在某些内容。找到值时会调用它,但在找不到任何内容时不会调用该块。这是预期的行为吗?

    ref.queryOrderedByKey().queryEqualToValue(channelName).observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in
        print("found channel:  \(snapshot.key)")
        }, withCancelBlock: { error in
        print(error.description)
    })

我做错了吗?感谢

1 个答案:

答案 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")
        }
    })