Ваш запрос неверен в соответствии с вашей структурой БД. Также не выполняйте запрос lastMessage
внутри блока другого запроса, потому что это полностью независимый запрос и не связан ни с одним. Ниже кусок кода будет работать для вас.
let ref = kFirDefaultDatabase.reference().child("yourChatRoomId").queryOrdered(byChild: "fromId").queryEqual(toValue: "0YfqnPIOYFYKb8cYZMHnSYti62i2").queryLimited(toLast: 1)
ref.observeSingleEvent(of: DataEventType.value) { (snapshot) in
if snapshot.exists() {
print(snapshot.value)
}
}
Получит последнее сообщение, отправленное fromId
для запрошенного chatRoomId
. Для более подробной информации смотрите Запросы Firebase Документ.
И если вы хотите сделать это в таблице для всех пользователей, как в WhatsApp
или другом приложении чата, вам нужно будет создать дополнительную таблицу LastMessages
и сохранить информацию о последнем сообщении здесь, соответствующую каждому chatRoomId
или, если Можно сохранить эту деталь где-нибудь, что вы можете получить с помощью tableData
, чтобы вам не нужно было запрашивать каждый chatRoom
в цикле.
Вы можете сделать что-нибудь получше, чтобы сделать это быстрее. Используйте CoreData
или Sqlite
и сохраняйте / обновляйте lastMessage
информацию в local db
всякий раз, когда вы отправляете или получаете какое-либо сообщение, где chatRoomId
будет primary key
, и сначала получите информацию из local db
и покажите в table
немедленно и означает, что вы можете получить данные с сервера, обновить local db
и обновить table
.
РЕДАКТИРОВАТЬ: Для комментария to get the last message regardless I send to recipient or recipient send to me
.
Удалите orderBy
запрос и просто используйте limitToLast
. Смотрите ниже код:
let ref = kFirDefaultDatabase.reference().child("yourChatRoomId").queryLimited(toLast: 1)
ref.observeSingleEvent(of: DataEventType.value) { (snapshot) in
if snapshot.exists() {
print(snapshot.value)
}
}