也许我理解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没有像我想的那样工作?
答案 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
}];