我正在构建一个聊天应用并使用以下数据结构:
基本上在user_chats
我跟踪用户所在的所有对话,以及该对话中last_message
的内容,以便稍后我可以在表格视图中显示此内容。
在messages
节点中,我通过自动ID存储给定对话的所有消息。
现在,当用户发送消息时,它应该出现在给定对话的messages
节点中,以及两个用户的对话的last_message
中。
在我使用调度组并对Firebase进行单独调用之前,这似乎非常不可靠且效率低下。
如何有效地同时更新所有值?
额外:此结构适用于1-1聊天应用吗?
使用工作代码更新:
我已设法使用扇出方法更新所有值。
这是我的代码:
NSDictionary *lastMessageDict = @{[self chatToUserID:userID] : @{@"last_message" : messageBody}};
NSDictionary *singleMessageDict = @{@"body" : messageBody, @"time_stamp" : kTimeStamp, @"sender" : uID};
NSString *autoID = [[self.databaseReference child:[NSString stringWithFormat:@"messages/%@/messages",[self chatToUserID:userID]]] childByAutoId].key;
NSDictionary *messagesDict = @{[self chatToUserID:userID] : @{@"init" : facebookUserID , @"messages" : @{autoID : singleMessageDict}}};
//Create fan out object
NSMutableDictionary *fanOut = [NSMutableDictionary new];
[fanOut addEntriesFromDictionary:@{[NSString stringWithFormat:@"user_chats/%@",uID] : lastMessageDict}];
[fanOut addEntriesFromDictionary:@{[NSString stringWithFormat:@"user_chats/%@",userID] : lastMessageDict}];
[fanOut addEntriesFromDictionary:@{@"messages" : messagesDict}];
[self.databaseReference updateChildValues:fanOut withCompletionBlock:^(NSError *error,FIRDatabaseReference *reference){
if(error){
NSLog(@"Error: %@",error);
}
else{
NSLog(@"updated!");
}
}];
答案 0 :(得分:1)
在@Frank van Puffelen的帮助下,我设法使用扇出方法使其工作。这是我的代码:
NSDictionary *lastMessageDict = @{[self chatToUserID:userID] : @{@"last_message" : messageBody}};
NSDictionary *singleMessageDict = @{@"body" : messageBody, @"time_stamp" : kTimeStamp, @"sender" : uID};
NSString *autoID = [[self.databaseReference child:[NSString stringWithFormat:@"messages/%@/messages",[self chatToUserID:userID]]] childByAutoId].key;
NSDictionary *messagesDict = @{[self chatToUserID:userID] : @{@"init" : facebookUserID , @"messages" : @{autoID : singleMessageDict}}};
//Create fan out object
NSMutableDictionary *fanOut = [NSMutableDictionary new];
[fanOut addEntriesFromDictionary:@{[NSString stringWithFormat:@"user_chats/%@",uID] : lastMessageDict}];
[fanOut addEntriesFromDictionary:@{[NSString stringWithFormat:@"user_chats/%@",userID] : lastMessageDict}];
[fanOut addEntriesFromDictionary:@{@"messages" : messagesDict}];
[self.databaseReference updateChildValues:fanOut withCompletionBlock:^(NSError *error,FIRDatabaseReference *reference){
if(error){
NSLog(@"Error: %@",error);
}
else{
NSLog(@"updated!");
}
}];