Firebase 获取数据

Posted

技术标签:

【中文标题】Firebase 获取数据【英文标题】:Firebase getting data 【发布时间】:2017-09-09 10:33:58 【问题描述】:

我正在尝试在 swift 3 中制作社交应用,并且我正在使用 Firebase。当我尝试制作一个喜欢/不喜欢的系统时,我遇到了问题。所以每个帖子都有这个定义:

Firebase post description

所以我在一个对象数组中检索每个帖子,这些对象的模型类似于数据库中的帖子 (POJO)。我在“信息”组件中也有一些喜欢/不喜欢的嵌套数据,它又是一组定制对象。 问题是我想在遍历所有帖子时初始化这个“信息”对象数组(比如来自关系数据库的联接)。考虑到 Firebase .observe 函数是异步的,我应该如何解决这个问题......这是我的方法:

var postsArray = [Post]()
var userInfoArray = [userInfo]()


func getDataFromServer()
posts.observe(DataEventType.childAdded, with:  (snapshot) in
        let values = snapshot.value! as! NSDictionary


        var postObject = Post()

        //getting posts and storing them into an array
        postObject.initialize(url: values["image"] as! String, userP: values["user"] as! String, earP: values["ear"] as! Bool, eyeP: values["eye"] as! Bool, textP: values["message"] as! String, uuidP: values["uuid"] as! String, keyP: snapshot.key) 

        self.keyArray.append(snapshot.key as! String)



        self.posts.child("\(postObject.key)").child("info").observe(DataEventType.value, with:  (snapshot) in
            if let info = snapshot.value as? NSDictionary

                var infoForPost = [userInfo]()
                for eachEntry in info

                //add to an array then set the info value for every post object
                infoForPost.append(eachEntry)


                

                postObject.setInfo(infoForPost)
            


        )






        self.postsArray.append(postObject)

        self.tableView.reloadData()


    )

我知道第二个 .observe 函数的代码不起作用,它应该是伪代码。提前致谢!

【问题讨论】:

为什么不在第一次观察闭包中遍历信息?我认为您不需要第二次关闭... 如何在没有其他观察功能的情况下做到这一点? 在第一个观察者中添加 print(snapshot.value) 并查看它打印的内容并检查是否也获得了 info 数组? 其实我明白了,但仍然不知道如何访问它 看看我的回答对你有没有帮助? 【参考方案1】:

我猜你只需要观察帖子,因为在你的帖子中你也得到了信息,所以你可以这样做:

 posts.observe(DataEventType.childAdded, with:  (snapshot) in
           if let values = snapshot.value as? [String: Any] 


            var postObject = Post()


            self.keyArray.append(snapshot.key as! String)

            if let ceva = values["info"] as? [String: Any]
                    print(ceva)



             
           

                postObject.setInfo(infoForPost)
       

更新:

要获得更多值,您可以这样做:

let values = Array(ceva.values)


for i in 0..<values.count 

        if let singleValue = values[i] as? [String: Any], let approved = singleValue["Approved"], let disapprove = singleValue["disappreove"]  
                print(approved)
                print(disapprove)
        




【讨论】:

pastebin.com/0mWjYHEj 输出只有:“ccc”我的帖子数 @adiveli 如果您将[[String: Any]] 替换为Any 然后尝试打印信息 “Type Any 不符合协议序列”错误 没有输出:( 好的,让我们做更多的调试,你能在firebase中显示你在哪里输入这个信息的代码

以上是关于Firebase 获取数据的主要内容,如果未能解决你的问题,请参考以下文章

从 Firebase 数据库中获取价值

无法从 firebase 回收器视图中的 firebase 实时数据库中获取嵌套数据

Firebase - 按顺序获取数据列表(最后一个数据)

如何从 OnMarkerClickListener 内的 Firebase 数据库中获取特定值?

无法从 firebase 获取过去 30 天的数据

我想通过特定的“存储桶/密钥”直接从数据库中获取Firebase数据