Swift Showing last sent message in chat using firebase

一笑奈何 提交于 2020-01-06 14:37:12

问题


I am trying to show my last sent message on my home screen of the chat messenger, from storyboard it looks like :

and the code I used are:

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
                    }
                })
            })
        }
    }
}

I have done some changes to my database and the above codes works, but after i changed the way i do my database, it doesnt work anymore previously, my firebase looks like

now my firebase looks like:

i made a chatRoomId by using send and receiver ID. however I am now not able to show my last sent message which was supposed to show on my homescreen. Any ways I can go about this? Or the way I fetched my database is wrong?


回答1:


Your query is wrong according to your db structure. Also don't perform lastMessage query inside the block of other query because this is totally independent query and not related with any. Below piece of code will work for you.

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)
     }
}

This will fetch the last message sent by fromId for the requested chatRoomId. For more detail have a look at Firebase Queries doc.

And if you want to do this in table for all users like in WhatsApp or other chatting application then you will need to make an extra table LastMessages and save last message information here corresponding to each chatRoomId or if possible save this detail somewhere you can fetch with the tableData so that you don't need to query for each chatRoom in a loop.

You can do some better stuff to make it faster. Use CoreData or Sqlite and save/update lastMessage information into local db whenever you send or received any message, where chatRoomId will be a primary key and first get the information from local db and show in the table immediately and mean while you can fetch the data from server and update your local db and refresh the table.

EDIT: For comment to get the last message regardless I send to recipient or recipient send to me.

Remove orderBy query and just use limitToLast. See below code:

let ref = kFirDefaultDatabase.reference().child("yourChatRoomId").queryLimited(toLast: 1)
ref.observeSingleEvent(of: DataEventType.value) { (snapshot) in
     if snapshot.exists() {
         print(snapshot.value)
     }
}



回答2:


You need to set up rooms differently.

If you you have 3 people in a room, what will the RoomID be ? If someone leaves the room how will you know what the room history is ?



来源:https://stackoverflow.com/questions/50149454/swift-showing-last-sent-message-in-chat-using-firebase

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!