检测连接状态调用两次
Posted
技术标签:
【中文标题】检测连接状态调用两次【英文标题】:Detecting Connection State Called Twice 【发布时间】:2018-07-05 09:29:50 【问题描述】:let connectedRef = Database.database().reference(withPath: ".info/connected")
connectedRef.observe(.value, with: snapshot in
if snapshot.value as? Bool ?? false
print("Connected")
else
print("Not connected")
)
我正在使用它来检测我与 Firebase 的连接状态。我的问题是当他们是互联网连接时,结果是“未连接”,然后是“已连接”。当他们没有互联网连接时,它只会直接进入“未连接”。谁能解释一下?
【问题讨论】:
可以提供funcobserve
的签名吗?如果有一个change
参数,那么它可能会被调用old
然后new
值
为什么不直接返回新值呢?旧值一开始就没用。
我不知道这个函数在你的示例中是如何工作的,但它看起来像 KVO,并且 KVO 允许你观察属性变化“from-to”、“from”、“to”等。在较新的 KVO API 中,观察块的参数中有一个对象,它封装了旧值、新值和更改类型,因此被调用一次。在 UIGestureRecognizer 中也使用此逻辑,当单处理程序被多次调用时,开发人员应处理识别器状态 - 即开始、更改、结束或失败。
【参考方案1】:
您看到的是预期的行为。
.info/connected
标志确定应用/客户端是否连接到 Firebase 数据库后端。虽然这当然需要您有互联网连接,但还有更多。这就是为什么 .info/connected
有可能成为 false
的原因,即使您的互联网连接正常。
当您启动应用程序时尤其如此。在应用程序启动后,Firebase 客户端连接到其数据库服务器之前需要一些时间,因此通常.info/connected
值以false
开头,然后变为true
。有时它甚至会在稳定之前切换几次。
另见:
How to handle internet connection status Firebase Firebase connection state listener returns false in javascript【讨论】:
以上是关于检测连接状态调用两次的主要内容,如果未能解决你的问题,请参考以下文章
Android怎么检测蓝牙的连接状态?如果一段断开,我这边怎么检测得到?
iOS下的实际网络连接状态检测:RealReachability
LISTENING,SYN_SENT,ESTABLISHED等TCP端口状态意思