Firebase查询不返回任何数据

时间:2019-05-26 11:02:49

标签: ios swift firebase firebase-realtime-database

我的数据模型如下:

allcomments
|__$comment_id_5
         |__post_id: <post_id_5>



uid
|
|__activity
     |__comments
            |__$random_activity_id
                       |__post_id : <post_id_5> //ref to post_id_5 in allcomments
                       |__comment_id : <comment_id_5> // ref to comment_id_5 in allcomments 

我的目标:检查具有uid的用户对帖子发表了评论。如果那个人有,那么我他可以继续前进,否则他会在屏幕上看到其他的东西。在尝试以下查询时,我只能在存在快照的情况下获取回调,而在其他情况下则无法。

FBDataservice.ds.child("allcomments").queryOrdered(byChild: "post_id").queryEqual(toValue: "post_id_5").observeSingleEvent(of: .ChildAdded) { (snapshot) in
        if let data = snapshot.value as? DataDict {
            let comment = Comment(comId: snapshot.key , comData: data)
            self.checkUserHasResponded(completion: { (hasResponded) in
                if !hasResponded {
                    // Never returns it there is nothng
                    print("You gotta respond first")
                } else {
                    //this part does work
                    print("Welcome to seeing everything")
                }
            })
        }
    }


func checkUserHasResponded(completion: @escaping (Bool) -> ()) {
    FBDataservice.ds.REF_USERS.child(uid).child("activity/comments").queryOrdered(byChild: "post_id").queryEqual(toValue: "post_id_5").observeSingleEvent(of: .value) { (snapshot) in
        snapshot.exists() ? completion(true) : completion(false)
    }
}

我什至尝试以这种方式调整体系结构并以不同的方式查询它,但仍然没有任何效果,程序的行为与上述情况完全相同。

uid
|
|__activity
     |__comments
            |__post_id_5 : comment_id_5

并运行以下查询:

func checkUserHasResponded(completion: @escaping (Bool) -> ()) {
    FBDataservice.ds.REF_USERS.child(uid).child("activity/comments").observeSingleEvent(of: .value) { (snapshot) in
        snapshot.hasChild("post_id_5") ? completion(true) : completion(false)
    }
}

我尝试将.childAdded更改为.value。它给出了完全相同的结果。尝试将.observeSingleEvent(of:)更改为.observe()。但是没有任何帮助。我不确定到底是什么问题。在这里检查大量答案,没有帮助。我到底在看什么。感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

使用.value而不是.childAdded,这样无论快照是否存在,都将调用该闭包,只需进行一次快速测试即可了解其工作原理。

func checkUserHasResponded() {
    let uid = "uid_0"
    let commentsRef = dbRef.child(uid).child("activity").child("comments")
    commentsRef.queryOrdered(byChild: "post_id")
               .queryEqual(toValue: "post_5")
               .observeSingleEvent(of: .value) { snapshot in
        if snapshot.exists() {
            print("post exists")
        } else {
            print("post not found")
        }
    }
}

如果您的结构不包含存在的post_id子值,则输出为

post not found

因此,此答案适用于更新后的问题。如果您要查询的节点不存在,因为查询使用的是.childAdded

,则闭包中的代码将不会运行
FBDataservice.ds.child("allcomments").queryOrdered(byChild: "post_id")
                                 .queryEqual(toValue: "post_id_5")
                                 .observeSingleEvent(of: .childAdded) { (snapshot) in

如果将其更改为.value,则返回该值,并且如果节点存在,则闭包中的代码运行。请记住,您将要使用

snapshot.exists()

,如果没有,它将为零。