Какой предпочтительный способ создания чата в 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 перед объединением, чтобы они были в одном и том же порядке, независимо от того, кто оказался первым в списке пользователей.
Этот подход не требует отслеживания того, в каких комнатах находится пользователь, и гарантирует, что одни и те же два (или более) пользователя всегда оказываются в одной комнате.