sametbilgi
sametbilgi

Reputation: 602

Firebase Nested Query With Completion

i am trying to get nested data with firebase. But i have some problem with my code.

My firebase data is:

-contentlikes
    -userID: true,
    -userID: true,
    -userID: true
-users
    -userID
        -name: "John"

And my code is:

override func viewWillAppear(_ animated: Bool) {
    self.displayUserKeys(completionHandler: { (userKeysInside, errorInside) in
        if userKeysInside != nil {
            self.userKeys = userKeysInside!
            print(self.userKeys)
        }
        self.detailUserTableView.rowHeight = UITableViewAutomaticDimension
        self.detailUserTableView.estimatedRowHeight = 64
        self.detailUserTableView.dataSource = self
        self.detailUserTableView.delegate = self
        self.detailUserTableView.reloadData()
    })
}

func displayUserKeys(completionHandler: @escaping ([String]?, Error?) -> ()) {
    self.detailUserHandler = DataService.dataService.CONTENTLIKE_REF.observe(.value, with: { (snapshot) in
        self.userKeys.removeAll()
        var userKeyInside = [String]()
        for child in snapshot.children.allObjects as! [FIRDataSnapshot] {
            let key = child.key
            userKeyInside.append(key)
        }
        completionHandler(userKeyInside, nil)
    }) { (errorInside) in
        completionHandler(nil, errorInside)
    }
}

I want to get users but cannot figure out how can i do.

Upvotes: 0

Views: 370

Answers (1)

Jen Jose
Jen Jose

Reputation: 4035

You need to fetch the user details from another User node based on the keys that you get from the first query. Firebase doesn't provide a join query and so we have to query again for user details which will be of type ObserveSingleEvent.

This is a sample code. I have written it without xcode editor so please pardon any silly mistakes.

        func displayUserKeys(completionHandler: @escaping ([String]?, Error?) -> ()) {
            self.detailUserHandler = DataService.dataService.CONTENTLIKE_REF.observe(.value, with: { (snapshot) in
                self.userKeys.removeAll()
                var userKeyInside = [String]()
                var userFetched = 0

                for child in snapshot.children.allObjects as! [FIRDataSnapshot] {
                    let key = child.key

                    //Query again to fetch user details.   
                    DataService.dataService.USER_REF.path(key).observeSingleEvent(.value, with: { (snapshot) in
                                userFetched = userFetched + 1
                                let user = snapshot.value  
                               //Append user to the array
                               userInside.append(user)
                      //Return back the array when all the user details as fetched.
                      if(userFetched == snapshot.children.count){
                          completionHandler(userInside, nil)
                       }
                    })
                }



            }) { (errorInside) in
                completionHandler(nil, errorInside)
            }
        }

Upvotes: 1

Related Questions