Firebase一次更新多个节点

时间:2017-01-26 12:50:03

标签: ios firebase firebase-realtime-database

我正在构建一个聊天应用并使用以下数据结构:

enter image description here

基本上在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!");
        }
    }];

1 个答案:

答案 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!");
    }
}];