【问题标题】:firebase onDisconnectSetValue not working as expectedfirebase onDisconnectSetValue 未按预期工作
【发布时间】: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 次尝试)。正如我所提到的,奇怪的是我重新连接到互联网后该值发生了变化。我等多久是独立的。是否有可能设置套接字超时?或者我在哪里可以看到设置的超时时间?

标签: ios xcode firebase


【解决方案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,这样我们就可以观察其他用户是否连接或断开连接。
猜你喜欢
  • 1970-01-01
  • 2018-11-24
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
相关资源
最近更新 更多