我的数据模型如下:
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()
。但是没有任何帮助。我不确定到底是什么问题。在这里检查大量答案,没有帮助。我到底在看什么。感谢您的帮助。
答案 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()
,如果没有,它将为零。