首页 > 解决方案 > 从 Firebase Auto Id 中检索数据 - Firebase Swift

问题描述

我想在 firebase 中捕获 childByAutoId 中的所有值。从本质上讲,它存储了一个人入围的所有项目。但是,我似乎没有捕捉到这一点,我认为这是因为我没有正确调用快照来分解自动 ID。

数据库:

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

代码:

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()
  }

有人可以看看,让我知道我可能做错了什么吗?谢谢!

标签: swiftfirebasefirebase-realtime-database

解决方案


发生这种情况是因为 Firebase 异步加载数据,而现在您在运行reloadData之前调用self.favUsers.append(likesList)

调用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")
  }
})

我还建议在 Firebase 中查看其中的一些答案异步数据加载。


推荐阅读