Home > Enterprise >  Retrieving Data From Firebase Auto Id's - Firebase Swift
Retrieving Data From Firebase Auto Id's - Firebase Swift

Time:10-10

I am wanting to capture all the values in my childByAutoId in firebase. Essentially, it stores all the items that a person has shortlisted. However, I do not seem to be capturing this, and I assume it is because I am not calling the snapshot correctly to factor the auto id's.

Database:

userID
 -> Favourited
    -> Auto Id
      -> itemName: x
    -> Auto Id
      -> itemName: x
    -> Auto Id
      -> itemName: x

Code:

func retrieveItems() {
        
  guard let userId = Auth.auth().currentUser?.uid else { return }

  let ref = Database.database().reference().child("users/\(userId)/Favourited")
        
   ref.observe(.value, with: { (snapshot) in
    if snapshot.childrenCount>0 {
       self.favUsers.removeAll()
       for likes in snapshot.children.allObjects as! [DataSnapshot] {
       let likesObject = likes.value as? [String: AnyObject]
       let itemName = likesObject!["itemName"]
       let likesList = Names(id: likes.key, itemName: itemName as! String?)
       self.favUsers.append(likesList)
  }
  } else {
    print("not yet")
  }
  })
    self.favList.reloadData()
  }

Could someone have a look and let me know what I may be doing wrong? Thank you!

CodePudding user response:

This happens because Firebase loads data asynchronously, and right now you're calling reloadData before the self.favUsers.append(likesList) has ever run.

The call to reloadData needs to be inside the close/completion handler that is called when the data comes back from Firebase:

ref.observe(.value, with: { (snapshot) in
  if snapshot.childrenCount>0 {
     self.favUsers.removeAll()
     for likes in snapshot.children.allObjects as! [DataSnapshot] {
       let likesObject = likes.value as? [String: AnyObject]
       let itemName = likesObject!["itemName"]
       let likesList = Names(id: likes.key, itemName: itemName as! String?)
       self.favUsers.append(likesList)
    }
    self.favList.reloadData() //            
  • Related