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’)。”

Firebase 持久化,清除 Firebase 缓存

Firebase 存储不会下载并添加到 firebase 数据库

将 Firebase 身份验证与 Firebase 数据库连接