检测连接状态调用两次

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端口状态意思

ActionCable:检测客户端连接丢失,向用户显示连接状态

SignalR:检测客户端上的连接状态