我试图通过调用以下命令来设置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()
胜过新观察者的设置!?我该如何克服!!
答案 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)
}
}
})