我很难弄清楚如何正确构建多用户聊天室 FirebaseDatabase
架构。
基本上,该应用程序支持用户之间的私有(private)消息(可以是 2 个用户或多个用户之间)。如果只是在 2 个用户之间,数据结构真的很简单。
我正在尝试降低成本(我不希望当前登录的用户正在与某人聊天,而观察者正在获取与该特定聊天无关的所有消息)并正确构建数据.如果仅在 2 个用户之间,我总是可以在当前用户 ID 下添加收件人并仅查询该节点。但是对于多个用户(甚至不确定其中有多少),我需要依赖聊天室 ID,但我很难做到这一点。
那么,想法是这样的,假设用户选择另一个开始聊天。我在想这样的事情:
我面临的问题是维护 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/