简体   繁体   English

从 Firebase 自动 ID 检索数据 - Firebase Swift

[英]Retrieving Data From Firebase Auto Id's - Firebase Swift

I am wanting to capture all the values in my childByAutoId in firebase. Essentially, it stores all the items that a person has shortlisted.我想在 firebase 中捕获我的 childByAutoId 中的所有值。本质上,它存储了一个人入围的所有项目。 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.但是,我似乎没有捕捉到这一点,我认为这是因为我没有正确调用快照来考虑自动 ID。

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!谢谢!

This happens because Firebase loads data asynchronously, and right now you're calling reloadData before the self.favUsers.append(likesList) has ever run.发生这种情况是因为 Firebase 异步加载数据,现在您在self.favUsers.append(likesList)运行之前调用reloadData

The call to reloadData needs to be inside the close/completion handler that is called when the data comes back from Firebase:reloadData的调用需要在数据从 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() // 👈 Move this here
  } else {
    print("not yet")
  }
})

I also recommend checking out some of these answers asynchronous data loading in Firebase .我还建议查看Firebase 中的异步数据加载中的一些答案。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM