swift - Firebase 数据库中的多用户聊天室数据结构

标签 swift firebase firebase-realtime-database

我很难弄清楚如何正确构建多用户聊天室 FirebaseDatabase 架构。

基本上,该应用程序支持用户之间的私有(private)消息(可以是 2 个用户或多个用户之间)。如果只是在 2 个用户之间,数据结构真的很简单。

我正在尝试降低成本(我不希望当前登录的用户正在与某人聊天,而观察者正在获取与该特定聊天无关的所有消息)并正确构建数据.如果仅在 2 个用户之间,我总是可以在当前用户 ID 下添加收件人并仅查询该节点。但是对于多个用户(甚至不确定其中有多少),我需要依赖聊天室 ID,但我很难做到这一点。

那么,想法是这样的,假设用户选择另一个开始聊天。我在想这样的事情:

enter image description here

enter image description here

我面临的问题是维护 chatId。每次用户要发送新消息时,我如何根据 chatId 检查是否已经有与同一接收者(或接收者)的聊天。这对我来说是令人困惑的部分。我已经坚持了好几天了,我想不出一种正确的方法来维护 chatId 并正确查询它。欢迎任何帮助。

最佳答案

如果我理解这个问题,该应用程序有多个用户,这些用户可以进行一对一或一对多的聊天,您希望避免用户获得他们不属于的聊天事件。

让我们从用户节点开始

users
  uid_0
    name: "Bill"
    chats:
      chat_id_0: true
      chat_id_9: true
  uid_1
    name: "Jesse"
    chats:
      chat_id_0: true
      chat_id_6: true
  .
  .
  .

然后是一个简化的聊天节点

chats
   chat_id_0:
     uid_0: "Hey there, Jesse"
     uid_1: "Sup Bill?"
   chat_id_6:
     uid_0: "This is Bill, anyone around?"
   chat_id_9:
     uid_1: "Look ma, no hands"
     uid_7: "Impressive"

在上面,chat_id_x 是在用户开始聊天时使用 .childByAutoId 创建的。

当 Bill 登录 (uid_0) 时,读取他的聊天节点,然后将观察员添加到该节点中列出的聊天中。在本例中,Bill 属于 chat_id_0 和 chat_id_9。对属于 0 和 6 的 Jesse 执行相同的过程。

Bill 和 Jesse 都在 chat_id_0 中聊天,Bill 正在等待所有也在观看 chat_id_6 的用户的回复,而 Jesse 正在 chat_id_9 中与 uid_7 交谈。

从那里任何时候有一个事件(例如,当新消息被添加到聊天时。childAdded)只有那些观察该聊天(“订阅”)的用户才会收到一个事件。

显然每个聊天节点中都会包含更多详细信息(时间戳等)

how do I check if there's already a chat with the same recepient (or recepients) based on the chatId

有几种方法可以解决这个问题;

一个是,当一个观察者被添加到每个聊天中时,您是 (.childAdded) 的一部分,该聊天节点中的每个子节点都将返回到您的应用程序。这有两方面的好处 - 一是用现有的聊天消息填充 UI,其次......您将知道谁参与了该聊天。将这些 UID 与聊天 ID 保存在一个数组中,并在向该人发送聊天之前查看它们是否作为现有聊天存在于数组中。

第二个选项是查询用户 uid 出现的所有聊天(使用 .observeSingleEvent 查询)。这将返回他们所属的所有聊天节点,然后获得他们正在与之聊天的其他人的 uid 以及聊天 ID。

另一种选择是在创建聊天时,/chat_id_0,添加一个名为/who_dat 的子节点,该节点保存被邀请加入聊天的人员列表

chats
  chat_id_0
     who_dat
        uid_0: true
        uid_1: true
        uid_2: true
     messages:
        uid_0: "Hey there, Jesse"
        uid_1: "Sup Bill?"

在这种情况下,uid_2 也已添加到 chat_id_0,但尚未收到他们的消息。

关于swift - Firebase 数据库中的多用户聊天室数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52218336/

相关文章:

android - 升级到 firebase messaging 17.1.0 后未生成 token

javascript - 如果使用 Redux 从 Firebase 获取数据,如何显示事件指示器

iOS后台获取。获取 Firebase 数据库

ios - 在单个应用程序中使用多个 Firebase 数据库 - Swift

ios - 从 firebase + iOS 获取数据时加载数据缓慢

swift - 如何在 Swift 中使用最新的 GMail API 插入邮件?

xcode - 播放 mp4 文件,然后切换到 View Controller ,文件播放正常,但无法找出切换到另一个 View 的代码

ios - UIBezierPath 不能改变线条的颜色

ios - Swift 3 - 调整字体大小以适合宽度,多行

swift - Firebase:过滤嵌套查询不起作用