Swift Отображение последнего отправленного сообщения в чате с использованием firebase - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь показать свое последнее отправленное сообщение на домашнем экране чата, с раскадровки это выглядит так: enter image description here

и код, который я использовал:

func getAllMsg() {
    self.users = []
    let fromId = Auth.auth().currentUser!.uid
    let ref = Database.database().reference().child("privateMessages").child(fromId)

    ref.observeSingleEvent(of: .value) { (snapshot) in
        for snap in snapshot.children.allObjects as! [DataSnapshot] {
            // retrieving receiver's ID
            let chatUserID = snap.key

            let ref2 = Database.database().reference().child("users").child(chatUserID)

            // to retrieve message ID
            ref2.observeSingleEvent(of: .value, with: { (snapshot2) in
                let newUser = User(dictionary: snapshot2.value as! [String: AnyObject])
            // to get the last message
            ref.child(chatUserID).queryLimited(toLast: 1).observeSingleEvent(of: .value, with: { (snapshot3) in

                let value = snapshot3.children

                while let rest = value.nextObject() as? DataSnapshot {
                    newUser.lastMessage = (rest.value as! [String: AnyObject])["textMessages"] as? String

                    self.users.append(newUser)

                    DispatchQueue.main.async {
                        self.tableView.reloadData()
                        }
                    break
                    }
                })
            })
        }
    }
}

Я внес некоторые изменения в свою базу данных, и вышеуказанные коды работают, но после того, как я изменил способ, которым я делаю свою базу данных, она больше не работает ранее моя база была похожа на

enter image description here

теперь моя огненная база выглядит так: enter image description here

Я сделал chatRoomId, используя ID отправителя и получателя. однако теперь я не могу показать свое последнее отправленное сообщение, которое должно было отображаться на домашнем экране. Любые способы я могу пойти по этому поводу? Или то, как я выбрал базу данных, неверно?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Ваш запрос неверен в соответствии с вашей структурой БД. Также не выполняйте запрос 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)
     }
}
0 голосов
/ 03 мая 2018

Вам нужно настроить комнаты по-другому.

Если у вас в комнате 3 человека, каким будет RoomID? Если кто-то покинет комнату, как вы узнаете, какова история комнаты?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...