首先,如果你有更好的标题或实际问题的意见,请随时编辑。我不知道怎样才能成功地提出这个问题。
所以我为swift做了几个Firebase聊天(iMessage/Facebook聊天)教程。我知道怎么发信息-

    let ref = Database.database().reference().child("Message")
    let childRef = ref.childByAutoId()
    let toID = finalSelected.ContactID as Any
    let fromID = Auth.auth().currentUser?.uid
    let values = ["Message": messageTextField.text!, "toID": toID, "fromID": fromID!] as [String: Any]
    childRef.updateChildValues(values) { (error, ref) in ...

我知道如何找回它们-
    let messagesOf = Auth.auth().currentUser?.uid

    let messageDB = Database.database().reference().child("Message")
    let userMessages = messageDB.queryOrdered(byChild: "toID").queryEqual(toValue: messagesOf)
    userMessages.observeSingleEvent(of: .childAdded, with: { (snapshot) in
         let values = snapshot.value as! Dictionary<String, String>

        let message = values["Message"]
        let from = values["fromID"]
        let post = ChatMessages()
        post.aMessage = message!
        post.Interested = from!

        self.messagesArray.append(post)
        self.tableView.reloadData()
   })

然而,我很难完成逻辑。我不明白这两个独立的事件是如何组合成一个相同的最终结果的,而不是两个不同的事务。让我看看能不能再解释一下。。。
我发了个信息。然后我作为另一个用户接收此消息。但我不明白如何下载同时引用这两个数据的to/from数据。除非我看的是忽略了一些细节,否则对一个事件的单个或多个观察是否只适用于一个用户?还是我误解了一些概念?
帮助完成这个最终的概念将是非常棒的。谢谢您。

最佳答案

现在有了一个聊天消息列表,这与在关系数据库中建模非常相似。但是Firebase是一个NoSQL数据库,所以您有更好的选项来建模聊天。
最常见的解决方案是将聊天室建模到数据库中。因此,如果两个用户正在聊天,那么这两个用户之间的消息将位于“房间节点”中。如果其他两个用户也在聊天,他们的信息将在一个单独的房间。数据模型如下:

chats: {
  roomid1: {
    messageid1: {
      fromId: "UidOfSender1",
      message: "Hello there user 2!"
    },
    messageid2: {
      fromId: "UidOfSender2",
      message: "Hey user 1. How are you?"
    }
  },
  roomid2: {
    messageid3: {
      fromId: "UidOfSender2",
      message: "Hi mom. Are you there?"
    },
    messageid4: {
      fromId: "UidOfSender3",
      message: "Hey there kiddo. Sup?"
    }
  }
}

在这里我们有两个聊天室,第一个在用户1和2之间,第二个在用户2和3之间。如果你想到你最喜欢的消息应用程序,你可能会看到房间如何非常直接地映射到你看到的对话。
另外请注意,您只需要保留发件人ID。收件人只是聊天室中的其他所有人。
这可能是您的下一个问题:我如何知道用户所在的房间。要确定这一点,您需要为每个用户保留一个单独的房间ID列表:
userRooms: {
  UidOfSender1: {
    room1: true,
    room2: true
  },
  UidOfSender2: {
    room1: true
  },
  UidOfSender3: {
    room2: true
  }
}

因此,现在您可以看到每个用户在哪些房间中是参与者。当你启动你最喜欢的消息应用程序时,你可能会再次看到这是如何映射到对话列表的。为了有效地显示这样一个列表,您可能需要为每个房间保留一些额外的信息,例如最后一条消息发布时的时间戳。
生成房间id是这个模型的另一个有趣的方面。在过去,我建议使用参与者的uid来确定房间ID,因为这会导致一个一致的、可重复的房间ID。
如果您是NoSQL数据库的新手,我建议您阅读http://stackoverflow.com/questions/33540479/best-way-to-manage-chat-channels-in-firebase。如果您来自SQL背景,我建议您观看NoSQL data modeling

07-26 09:38
查看更多