firebase onDisconnectSetValue 未按预期工作
Posted
技术标签:
【中文标题】firebase onDisconnectSetValue 未按预期工作【英文标题】:firebase onDisconnectSetValue not working as expected 【发布时间】:2015-12-21 16:57:29 【问题描述】:也许我理解 firebase 的 onDisconnectSetValue 错误,但我希望如下: 在firebase中,如果应用程序与firebase连接,我有一个值为“active”的值。如果连接丢失,我喜欢使用 onDisconnectSetValue 将值设置为 false。 为了测试它,我执行以下操作: - 使用互联网连接启动应用程序(设置 wlan) - 应用程序将“活动”设置为真 - 现在我切断互联网连接(关闭无线局域网)
现在我希望 firebase 自动将“Active”设置为 false,但该值保持为 true。
奇怪的是,如果我重新连接到互联网(再次打开 wlan),“活动”设置为 false。
代码:
Firebase *userAppActiveRef = [Firebase userAppActiveRef: user.entityID];
Firebase *infoRef = [Firebase infoRef];
[infoRef observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot)
if([snapshot.value boolValue])
NSLog(@"connected");
[userAppActiveRef setValue: @YES];
[userAppActiveRef onDisconnectSetValue: @NO];
else
NSLog(@"not connected");
];
infoRef = .../.info/connected
我做错了什么或者 onDisconnectSetValue 没有按照我的想法工作?
【问题讨论】:
如果你强行断开连接(而不是调用goOffline()
),服务器会在套接字超时后检测到客户端已经消失。这通常需要几分钟。你等了多久?
大约 5 - 20 分钟(4 次尝试)。正如我所提到的,奇怪的是我重新连接到互联网后该值发生了变化。我等多久是独立的。是否有可能设置套接字超时?或者我在哪里可以看到设置的超时时间?
【参考方案1】:
尝试这个稍微不同的方向(这是您发布的大部分代码的扩展版本)
这有两个部分。第 1 部分是应用程序知道自己是否已连接(并采取任何一种方式),第 2 部分是知道其他用户是否已连接:
//keep track if the app is connected to firebase or not via isConnected
// isConnected has KVO listeners in the classes so they can take
// action when the user disconnects or reconnects
Firebase *connectedRef = [self.appRef childByAppendingPath:@".info/connected"];
[connectedRef observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot)
//KVO property will change if the app d/c's
self.isConnected = [snapshot.value boolValue];
if ( self.isConnected )
NSLog(@"connected");
[thisUserStatusRef setValue:@"YES"];
else
NSLog(@"d/c'd!! Run for the hills!");
];
通过此设置,应用知道何时连接,并将 thisUsersStatusRef 设置为 YES。
然后,设置 onDisconnect 以在用户断开连接时执行操作
[thisUserStatusRef onDisconnectRemoveValue];
这告诉服务器在客户端断开连接时删除 thisUsersStatusRef(您也可以设置为 NO)。
所以当用户连接时,thisUsersStatusRef 设置为 YES,当它断开连接时,该值被删除。
最后,让您的应用观察用户节点是否有任何更改 - 如果另一个用户连接应用程序,则会收到通知,如果他们断开连接,他们也会收到通知。
[usersRef observeEventType:FEventTypeChildChanged withBlock:^(FDataSnapshot *snapshot)
//the snapshot will contain the user that connected or disconnects
// so just test to see if status is YES or null
];
【讨论】:
@MJQZ1347 有一些不同之处,请注意我的回答指出这是您发布的大多数代码的扩展版本。首先有一个设置对监视连接的节点的引用的示例。接下来,我们添加了一个 KVO 变量,应用程序的其他部分可以观察该变量以自动更新断开连接。例如,该变量可以保存在应用程序委托中。然后其他类可以观察该变量,并且当用户断开连接时,可以采取行动。此外,还有一个 sn-p,这样我们就可以观察其他用户是否连接或断开连接。以上是关于firebase onDisconnectSetValue 未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章
无法解决:com.google.firebase:firebase-ml-vision:24.1.3;无法解决:com.google.firebase:firebase-core:20.0.2
没有创建 Firebase 应用“[DEFAULT]” - 在 Flutter 和 Firebase 中调用 Firebase.initializeApp()
如何修复 Firebase 9.0 导入错误? “尝试导入错误:‘firebase/app’不包含默认导出(导入为‘firebase’)。”