Какой предпочтительный способ создания чата в Firebase/Swift для двух подходящих пользователей?

Я работаю над созданием клона Tinder на Firebase 100%, от аутентификации до чата в реальном времени. Мне удалось показать пользователям их взаимно заинтересованные совпадения на табличном представлении контроллера представления сообщений. Теперь моя проблема заключается в создании чата для соответствующих пользователей. Каков наиболее эффективный способ добиться этого?

Могу ли я создавать объекты чата из базовой ссылки 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()
    })
}

1 ответ

Решение

Распространенным способом является создание имени комнаты на основе пользователей в этой комнате.

Так что, если ваш UID ron и мой pufмы попадаем в комнату puf_ron,

Обратите внимание, что я заказал uid перед объединением, чтобы они были в одном и том же порядке, независимо от того, кто оказался первым в списке пользователей.

Этот подход не требует отслеживания того, в каких комнатах находится пользователь, и гарантирует, что одни и те же два (или более) пользователя всегда оказываются в одной комнате.

Другие вопросы по тегам