Firebase observeEventType:永远不会调用FIRDataEventTypeChildChanged回调

时间:2017-06-13 05:35:44

标签: ios objective-c firebase firebase-realtime-database

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

如果我使用

observeSingleEventOfType:FIRDataEventTypeValue  

它起作用并且反应良好。但是当然它会给我一次结果。

如果我打电话给以下方法:

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

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

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

在my.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];
}

指导我错误的地方,或者我应该用什么来获取(实时)更新的聊天记录。

3 个答案:

答案 0 :(得分:1)

每次添加观察者时,都在重新初始化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);

}];

希望,它有效

答案 1 :(得分:1)

我已经找到了解决方案,

第一次如果我们没有在firebase数据库下创建子节点。在我的情况下,chat_roomuserID

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

所以当我在chat_room中添加第一条消息时。为该用户创建节点。然后我必须使用observeSingleEventOfType:FIRDataEventTypeValue

获取所有记录

然后注册了Child Changed观察者,最后每次更改observeEventType:FIRDataEventTypeChildChanged都按预期工作。

答案 2 :(得分:0)

你完全错了,如果你想获得一个对象的实时价值,你可能希望在Firebase数据库参考类型上使用FIRDataEventTypeAdded