William Loke
William Loke

Reputation: 377

Swift Showing last sent message in chat using firebase

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

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

enter image description here

now my firebase looks like: enter image description here

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?

Upvotes: 0

Views: 2429

Answers (2)

TheTiger
TheTiger

Reputation: 13354

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

Upvotes: 1

Mark
Mark

Reputation: 515

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 ?

Upvotes: 0

Related Questions