Firebase observeEventType:FIRDataEventTypeChildChanged 回调从未调



我想获取实时更新的数据库对象。每当在聊天列表中添加新消息时。

如果我使用

observeSingleEventOfType:FIRDataEventTypeValue  

它有效并且响应良好。但当然它会给我一次结果。

如果我调用以下方法:

observeEventType:FIRDataEventTypeChildChanged

据我所知,它将在第一次和每次更换孩子时给出结果。(添加了新消息(

但这从未回电。如果我在数据库中添加一些新消息,不是第一次。

这就是我调用这些方法的方式:

在我的.h文件中

@property (strong, nonatomic) FIRDatabaseReference *ref;

viewDidLoad

_ref = [[FIRDatabase database] reference];
[self getChats];

最后:

-(void) getChats {
//  this is working
[[[_ref child:@"chat_rooms"] child:userID] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
    NSDictionary *dict = snapshot.value;
    NSLog(@"%@",dict);
}];
// this is not working / Never calling
[[[_ref child:@"chat_rooms"] child:userID] observeEventType:FIRDataEventTypeChildChanged
 withBlock:^ (FIRDataSnapshot * _Nonnull snapshot) {
     NSDictionary *dict = snapshot.value;
     NSLog(@"%@",dict);
 }];

 // this is not working / Never calling too
[[[_ref child:@"chat_rooms"] child:userID] observeEventType:FIRDataEventTypeChildAdded
 withBlock:^ (FIRDataSnapshot * _Nonnull snapshot) {
     NSDictionary *dict = snapshot.value;
     NSLog(@"%@",dict);
 }];
}
//this is how I m sending message to database. 
//and this is working good. message added in node. verified at firebase console
- (void)sendMessage : (NSDictionary*) dict
{
    [[[[_ref child:@"chat_rooms"] child:userID] childByAutoId] setValue:dict];
}

引导我错在哪里,或者我应该使用什么来获取(实时(更新的聊天。

每次添加观察程序时,您都会重新初始化 FIRDatabaseReference。因此,请尝试以下操作:在viewDidLoad方法中,

_ref = [[FIRDatabase database] reference];
_ref = [[_ref child:@"chat_rooms"] child:userID]; // Pass Your userID here

然后,称呼您的观察者为,

[_ref observeEventType:FIRDataEventTypeChildAdded
 withBlock:^ (FIRDataSnapshot * _Nonnull snapshot) {
     NSDictionary *dict = snapshot.value;
     NSLog(@"%@",dict);
}];

希望,它有效

我已经找到了解决方案,

如果我们没有在 Firebase 数据库下创建子节点,这是第一次。就我而言,它与userID chat_room

所以观察者observeEventType:FIRDataEventTypeChildChanged永远不会调用,因为观察者没有找到它必须观察的孩子。而且我想它甚至没有注册观察。

因此,当我在chat_room中添加第一条消息时.节点是为该用户创建的。然后我必须用observeSingleEventOfType:FIRDataEventTypeValue获取所有记录

然后注册子更改观察者,最后注册每个更改observeEventType:FIRDataEventTypeChildChanged按预期工作。

你完全错了,如果你想获取对象的实时值,你可能想在Firebase数据库引用的类型上使用FIRDataEventTypeAdded

最新更新