Search code examples
iosswiftfirebasefirebase-realtime-databasedispatch-queue

Firebase query not executing in the correct order?


I fetch data and display in a tableView, the problem is the data is not executing in the correct order.

I have tried:

            for case let child as DataSnapshot in data!.children.reversed() {
                let newDispatchGroup = DispatchGroup()
                let commentID = child.key
                let uid = child.childSnapshot(forPath: "UID").value as! String
                let commentText = child.childSnapshot(forPath: "Comment").value!
                let timeStamp = child.childSnapshot(forPath: "timeStamp").value!
                let date = ConvertDate(mediaTimestamp: timeStamp as! Double).getDate!
                //print(date, "dsfsdafdasfdsafdsahjkfhfdsafsajkadhffdsfsafsasjkfhsdajkhfdsajkhfjklads")

                newDispatchGroup.enter()

                ref.child("users2").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
                    print(snapshot, "dshjkfhjkadhfsjkfhsdajkhfdsajkhfjklads")
                    print(date, "dsfsdafdasfdsafdsahjkfhfdsafsajkadhffdsfsafsasjkfhsdajkhfdsajkhfjklads")

                    let username = snapshot.childSnapshot(forPath: "username").value
                    let profileImage = snapshot.childSnapshot(forPath: "profileImage").value

                    let newUser = User(theuserID: uid, theUsername: username as! String, theprofImage: profileImage as! String)

                    let newComment = Comment(newUser: newUser, text: commentText as! String, timeStamp: date, NcommentID: commentID)
                    self.commentsVC1.arrayOfComments.append(newComment)
                    newDispatchGroup.leave()
                    //completion()
                })
                newDispatchGroup.notify(queue: .main, execute: {
                    print(self.totalComments, "COgfdsdfgfdsgdsfgdfsgfdsgdfsgdskj", self.commentsVC1.arrayOfComments.count)
                    if self.totalComments == self.commentsVC1.arrayOfComments.count {
                        print("COmejkfbdshkafdsagfhksdagfdsakj")
                        self.commentsVC1.tableView.reloadData()
                    }
                })
            }
        })
    }

But it did not work either, the order in which the second firebase calls execute is incorrect.


Solution

  • I solved with this:

        for case let child as DataSnapshot in snap.children.reversed() {
                        let commentID = child.key
                        let uid = child.childSnapshot(forPath: "UID").value as! String
                        let commentText = child.childSnapshot(forPath: "Comment").value!
                        let timeStamp = child.childSnapshot(forPath: "timeStamp").value!
                        let date = ConvertDate(mediaTimestamp: timeStamp as! Double).getDate!
                        let newUser = User(theuserID: uid)
                        let newComment = Comment(newUser: newUser, text: commentText as! String, timeStamp: date, NcommentID: commentID)
                        self.commentsVC1.arrayOfComments.append(newComment)
                        ref.child("users2").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
    
                            let username = snapshot.childSnapshot(forPath: "username").value
                            let profileImage = snapshot.childSnapshot(forPath: "profileImage").value
    
                            let newUserIner = User(theuserID: uid, theUsername: username as! String, theprofImage: profileImage as! String)
                            newComment.user = newUserIner
                            if self.totalComments == self.commentsVC1.arrayOfComments.count {
                                self.commentsVC1.tableView.reloadData()
                            }
                        })
                    }
    

    I would use dispatch group here though so one does not have have to check if its done unnecessarily.