ios - 如何同时观察两个用户之间的所有 firebase 数据库事件?

标签 ios swift firebase firebase-realtime-database chat

首先,如果您对本次提交的标题或实际问题有更好的建议,请随时进行编辑。我对如何成功提出这个问题感到困惑。

因此,我已经完成了几个 Firebase 聊天(iMessage/Facebook 聊天)swift 教程。我知道如何发送消息 -

    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()
   })

但是,我很难完成逻辑。我不明白这两个独立的事件如何组合成一个相同的最终结果——而不是两个不同的交易。让我看看是否可以进一步解释...

我发了一条消息。然后我以另一个用户的身份收到此消息。但我不明白如何下载同时引用两者的来往/来自数据。除非我忽略了一些细节,否则对一个事件的单个或多个观察是否只适用于一个用户?或者我在这里误解了一些概念?

帮助完成这个最终概念将是非常棒的。谢谢。

最佳答案

您现在有一个聊天消息列表,这与您在关系数据库中建模的方式非常相似。但是 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。有关示例,请参阅 http://stackoverflow.com/questions/33540479/best-way-to-manage-chat-channels-in-firebase .

如果您是 NoSQL 数据库的新手,我建议您阅读 NoSQL data modeling .如果您有 SQL 背景,我建议您观看 Firebase for SQL developers .

关于ios - 如何同时观察两个用户之间的所有 firebase 数据库事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48178492/

相关文章:

ios - 如何将JSON数据转换为模型

约束的快速动画不起作用

swift - 在 Swift 中进行应用内购买时,隐藏不同 View Controller 中的 UIButton

swift - 登录后存储 CurrentUser 的最佳实践

arrays - 在 Firebase 中以数组方式存储值的正确方法

ios - 同时关闭两个 NavigationController

ios - Pod 安装停留在 "Setting up CocoaPods Master repo"

ios - UILabel 没有可见接口(interface)声明选择器 objectAtIndex

ios - 等待要在下一次分派(dispatch)时执行的 block 如何成功?

javascript - 如何在 firebase 中验证密码? (不是用户凭据)