我想获取实时更新的数据库对象。每当在聊天列表中添加新消息时。
如果我使用
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