firebase onDisconnectSetValue无法按预期工作

时间:2015-12-21 16:57:29

标签: ios xcode firebase

也许我理解firebase的onDisconnectSetValue错误,但我希望如下: 在firebase我有一个值"活跃"这是真的,如果应用程序与firebase连接。如果连接丢失,我喜欢使用onDisconnectSetValue将值设置为false。 要测试它,我执行以下操作: - 使用互联网连接启动应用程序(设置wlan) - 应用程序集" Active"为真 - 现在我切断了互联网连接(设置关闭)

现在我希望firebase自动设置" Active"为假,但价值保持不变。

奇怪的是," Active"如果我重新连接到互联网(再次设置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没有像我想的那样工作?

1 个答案:

答案 0 :(得分: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

 }];