在 Firebase/Swift 上为两个匹配的用户创建聊天室的首选方法是什么?

What's a preferred way of creating a chatroom on Firebase/Swift for two matched users?

我正致力于 100% 在 Firebase 上创建 Tinder 克隆,从身份验证到实时聊天。我已经成功地在消息视图控制器的表视图上向用户展示了他们相互感兴趣的匹配项。现在我的问题在于为匹配的用户创建一个聊天室。最有效的方法是什么?

我是否根据 Firebase 基础参考创建聊天室对象,并为聊天室分配两个用户,并将聊天室的密钥插入两个用户?

我只是对如何去做感到困惑,因为我已经编写了代码来开始上面的想法,但是我如何才能确保一旦创建了聊天室,用户将始终拥有它房间,没有为他们初始化一个全新的房间?我想我的做法是错误的......我现在拥有代码的方式是,当我 运行 这段代码时,聊天室将在消息视图控制器上创建:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    currentUserKey = DataService.ds.REF_CURRENT_USER.key

    DataService.ds.REF_CURRENT_USER.observeSingleEventOfType(.Value, withBlock: { snapshot in

        if let matchesInterestedIn = snapshot.value["matchesInterestedIn"] {
            if matchesInterestedIn != nil {
                for (_, value) in matchesInterestedIn as! [String: String]  {
                    self.currentUserInterests.append(value)
                }
            }
        }
    })

    DataService.ds.REF_USERS.observeSingleEventOfType(.Value, withBlock: { snapshot in

        self.admirers = [Match]()
        self.matches = [Match]()

        if snapshot != nil {
            for potentialMatch in snapshot.children {
                let potentialMatchData = potentialMatch.valueInExportFormat()
                if potentialMatchData["matchesInterestedIn"] != nil {
                    if let potentialMatchInterests = potentialMatchData["matchesInterestedIn"] as? Dictionary<String, String> {
                        if potentialMatchInterests.values.contains(self.currentUserKey) {
                            let interestedMatch = Match(snapshot: potentialMatch as! FDataSnapshot)
                            self.admirers.append(interestedMatch)
                        }
                    }
                }
            }
        }
        if self.admirers.count > 0 {
            for potentialMatch in self.admirers {
                if self.currentUserInterests.contains(potentialMatch.key) {
                    self.matches.append(potentialMatch)

                    let chatRoomInitializer = ["user1": self.currentUserKey, "user2": potentialMatch.key]
                    let chatRoomRef = DataService.ds.REF_CHATROOMS.childByAutoId()
                    let chatRoomID = chatRoomRef.key

                    // For some odd reason, the next two lines of code create an endless amount of chatroom objects from the base reference
                    let currentUserChatRoomRef = DataService.ds.REF_CURRENT_USER.childByAppendingPath("chatrooms").childByAutoId()
                    currentUserChatRoomRef.setValue(chatRoomID)

                    let potentialMatchRef = DataService.ds.REF_USERS.childByAppendingPath(potentialMatch.key).childByAppendingPath("chatrooms").childByAutoId()
                    potentialMatchRef.setValue(chatRoomRef.key)

                    chatRoomRef.setValue(chatRoomInitializer)

                }
            }
        }

        self.tableView.reloadData()
    })
}

一种常见的方法是根据房间中的用户创建房间名称。

因此,如果您的 uid 是 ron 而我的是 puf,我们最终会进入一个房间 puf_ron

请注意,我在连接之前对 uid 进行了排序,因此无论谁在用户列表中排在第一位,它们的顺序都是相同的。

这种方法不需要跟踪用户所在的房间,并确保相同的两个(或更多)用户总是在同一个房间。