从Firebase数据库下载帖子时出错(Swift 3)

时间:2017-01-30 13:34:21

标签: ios firebase swift3 xcode8

我有一个社交应用程序,有像Facebook这样的帖子,但当我尝试下载帖子时,它返回nil。

environments/prod/backend2

经过一些调试后,我将问题减少到这行返回nil值的代码

FIRDatabase.database().reference().child("following").child(FIRAuth.auth()!.currentUser!.uid).queryOrderedByValue().queryEqual(toValue: true).observeSingleEvent(of: .value, with: {(snap) in
    if let snapDict = snap.value as? [String:AnyObject]{
        for each in snapDict{


            FIRDatabase.database().reference().child("Posts").child(String(each.key)).queryOrdered(byChild: "timestamp").observeSingleEvent(of: .value, with: {(snapshot) in

                if (snapshot.value != nil)
                {
                    self.Posts.append(snapshot.value as! NSDictionary)


                }

            }){(error) in

                print(error.localizedDescription)
            }

        }

    }

    self.homeTableView.reloadData()

    self.aivLoading.stopAnimating()
})

我的代码的另一部分确实会返回您关注的人员列表并循环考虑它。

这是我数据库的结构。

FIRDatabase.database().reference().child("Posts").child(String(each.key)).queryOrdered(byChild: "timestamp").observeSingleEvent(of: .value, with: {(snapshot) in

这是我的整个代码。 https://www.dropbox.com/sh/u7saz4mdbehw1gd/AACv2rZH7M8jS_lU-plSqwc5a?dl=0

2 个答案:

答案 0 :(得分:0)

如果这是一个有效的数据集,那么你在查询中找错了,但可能是因为我不理解你的数据!

我假设currentUserdEXaVLDOSPfJa3zTyUNqAEtVuMR2,并且第一个获取以下内容的查询应该返回mt0fzirhMhazIcy90MRWuRpTfmE2

您在帖子中没有mt0fzirhMhazIcy90MRWuRpTfmE2的任何引用,因此您永远不会在第二个查询中返回任何内容......

答案 1 :(得分:0)

经过大量的调试后我发现了这个问题,因为它在这个问题上探究了这个问题

 FIRDatabase.database().reference().child("Posts").child(String(each.key)).queryOrdered(byChild: "timestamp").observeSingleEvent(of: .value, with: {(snapshot) in

                if (snapshot.value != nil)
                {
                    self.Posts.append(snapshot.value as! NSDictionary)


                }

            }){(error) in

                print(error.localizedDescription)
            }

查询实际上是在下载所有帖子,但它们保存在非静态变量(noob错误)中,所以我唯一需要做的就是在收到每个帖子之后重新加载数据,也就是说它需要是这样的:

FIRDatabase.database().reference().child("Jalas").child(each.key).queryOrderedByKey().observe(.childAdded, with: { (snapshot:FIRDataSnapshot) in

                        print(snapshot.value as! NSDictionary)

                        self.Jalas.append(snapshot.value as! NSDictionary)
                        self.homeTableView.reloadData()
                    })

所以完整的代码看起来像这样:

        self.homeTableView.delegate = self
        self.homeTableView.dataSource = self

        self.loggedInUser = FIRAuth.auth()?.currentUser

        print("LoggedInUser: " + (self.loggedInUser?.uid)!)


        FIRDatabase.database().reference().child("following").child(FIRAuth.auth()!.currentUser!.uid).queryOrderedByValue().queryEqual(toValue: true).observeSingleEvent(of: .value, with: {(snap) in

            //if let snapDict = snap.value as? [String:AnyObject]{

            let sanpDict = snap.value as? [String:AnyObject]
            if (sanpDict != nil)
            {
                for each in sanpDict!{

                    print("each.key es: " + String(each.key))

                    FIRDatabase.database().reference().child("Jalas").child(each.key).queryOrderedByKey().observe(.childAdded, with: { (snapshot:FIRDataSnapshot) in

                        print(snapshot.value as! NSDictionary)

                        self.Jalas.append(snapshot.value as! NSDictionary)
                        self.homeTableView.reloadData()
                    })

                }
        }


            self.aivLoading.stopAnimating()
        })