Firebase观察器无法正常工作,为什么不监视值的变化?

时间:2018-12-25 03:16:46

标签: swift firebase firebase-realtime-database observers

我试图通过调用以下命令来设置Firebase观察器:

ref.child(id).child("isLocked").observe(.value, with: { snapshot in

    print("isLocked = ", snapshot.value!)

})

当视图加载时,它可以完美工作。打印出正确的值。

当我去更改Firebase本身或单独设备中的值时,永远不会再次打印isLocked。应该在什么时候开始,因为我在路上有观察员。有什么作用?

这里的最终目标是根据lock的值为true或false来提供UIButton。

该视图已加载button.isHidden = true

更新

我发现与观察员发生问题的根源不是“工作中”

似乎存在计时问题。

在先前的视图控制器(它连接到新的视图控制器中)中,我在“ viewDidDisappear”函数中调用ref.child(pID).child("isLocked").removeAllObservers()

然后在新的视图控制器中,我正在“尝试”设置相同的路径观察器'ref.child(id).child(“ isLocked”)。observe(.value,其中:{快照在其中

我猜removeAllObservers()胜过新观察者的设置!?我该如何克服!!

2 个答案:

答案 0 :(得分:2)

我发现与观察员发生问题的根源不是“工作中”

似乎存在计时问题。

在上一个视图控制器(它连接到新的视图控制器中)中,我正在ref.child(pID).child("isLocked").removeAllObservers()函数中调用viewDidDisappear

在新的视图控制器中,我正在“尝试”设置相同的“路径观察器” ref.child(id).child("isLocked").observe(.value, with: { snapshot in

我想removeAllObservers()胜过新观察者的设置!?

要解决此问题,您需要为每个观察者设置特定的句柄!确保使用唯一的var名称并且不重复使用,然后调用以下内容而不是removeAllObservers()

ref.child(id).child("isLocked").removeObserver(withHandle: confirmVCRefHandle!)

上述句柄名称confirmVCRefHandle是唯一的,并且解决了计时问题!

答案 1 :(得分:0)

尝试一下:

ref.child(id).observe(.childChanged, with: { snapshot in

    if snapshot.key == "isLocked" {
        if let value = snapshot.value as? Bool {
            print(value)
        }
    }
})