使用firebase中的childAdded从firebase获取数据

时间:2017-05-23 09:40:57

标签: ios swift uitableview firebase

我正在尝试使用observe(.childAdded)检索一些数据,以便获取项目的新“帖子”并将其正确添加到tableview中。 实际上我使用这个函数得到了我需要的结果。

        databaseHandle = ref?.child("Posts").observe(.childAdded, with: { (snapShot) in

        let post = snapShot.value as? String
        if let actualPost = post {

            self.postData.insert(actualPost, at: 0)
            self.tableView.reloadData()
        }

    })

但它仅适用于在FireBase中具有此值的子项:

*Root
  *Posts
     *ChildByAutoId: "post text value"

实际上我想要的是一个有这样属性的孩子:

*Root
  *Posts
    *ChildByAutoId 
       -Text: "post text value"
       -UserId: "userId"
       -CreationDate: "date"
       -PostId: "PostId"
       -Likes: Int
       -Author: "name"

我希望得到与使用.observe(.childAdded)相同的结果,但我无法做到。 我发现它目前工作的唯一方法是:

    func recuperarData(){
    let ref = self.ref

    ref?.child("Posts").queryOrderedByKey().observeSingleEvent(of: .value, with: { (snapShot) in
        if let posts = snapShot.value as? [String : AnyObject]{
            for (_, value) in posts{
                let post = Posts()

                if let autor = value["Author"] as? String ,let likes = value["Likes"] as? Int, let fecha = value["CreationDate"] as? String, let postId = value["PostID"] as? String, let texto = value["Text"] as? String, let userID = value["UserId"] as? String {
                    post.autor = autor
                    post.likes = likes
                    post.fecha = fecha
                    post.PostId = postId
                    post.texto = texto
                    post.UserId = userID
                    self.posts.append(post)                        
                }                    
            }
            self.tableView.reloadData()
        }            
    })        
    ref?.removeAllObservers()
} 

但这只检索了所有数据每次我“重新加载”tableview并且没有按照我想要的顺序正确添加帖子。

有人知道使用.observe(.childAdded)获取此数据的正确方法,因此我可以自动升级tableview。

我正在使用Xcode 8.2.1和swift 3 感谢

1 个答案:

答案 0 :(得分:0)

我很震惊没有人能够在原来的.childAdded函数中提出问题。

let post = snapShot.value as? String是问题所在。

Firebase数据库是键值配对,因此您无法将整个结果转换为字符串。您在执行.value时通过将其转换为字典来解决此问题。在.childAdded函数中执行相同的操作。

我在Firebase中有类似的answer解释词典处理。