我想获得实时更新的数据库对象。每当在聊天列表中添加新消息时。
如果我使用
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];
}
指导我错误的地方,或者我应该用什么来获取(实时)更新的聊天记录。
答案 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_room
与userID
所以观察者observeEventType:FIRDataEventTypeChildChanged
永远不会打电话,因为观察者没有找到它必须观察的孩子。我想它甚至没有注册观察。
所以当我在chat_room
中添加第一条消息时。为该用户创建节点。然后我必须使用observeSingleEventOfType:FIRDataEventTypeValue
然后注册了Child Changed观察者,最后每次更改observeEventType:FIRDataEventTypeChildChanged
都按预期工作。
答案 2 :(得分:0)
你完全错了,如果你想获得一个对象的实时价值,你可能希望在Firebase数据库参考类型上使用FIRDataEventTypeAdded