Reputation: 602
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
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