我一直在尝试创建一个社交应用程序,让人们对其他人进行评分。我已经能够检索并显示每条评论的评级,但是我一直难以获得所有评级来计算平均值。
这是我的代码:
func observeStars() {
guard let toId = users?.id else {
return }
let placesRef = Database.database().reference().child("Review")
placesRef.observeSingleEvent(of: .value, with: { snapshot in
for child in snapshot.children {
let placeSnap = child as! DataSnapshot
let ratingsSnap = placeSnap.childSnapshot(forPath: "STAR")
print(ratingsSnap)
let count = ratingsSnap.childrenCount
var total: Double = 0.0
for child in ratingsSnap.children {
print(child)
let snap = child as! DataSnapshot
let val = snap.value as! Double
total += val
}
let average = total/Double(count)
print(average)
}
})
}
我的 Firebase 数据库结构如下所示:
{
"Review" : {
"75YFHCGX8WQyP3qlyvQKNohgCvQ2" : {
"-LM9OW1eLcS9yr3JZxP5" : {
"FROM" : "AV4RFwIlSNdnryfPPCl6SfLOzBZ2",
"STAR" : 3,
"TIMESTAMP" : 1.5366990112576609E9,
"TO" : "75YFHCGX8WQyP3qlyvQKNohgCvQ2"
},
"-LM9OoyD8A8HWZ387Ln9" : {
"FROM" : "MAc9ouJnAacHddqDMRet3K9SkZq1",
"STAR" : 2,
"TIMESTAMP" : 1.5366990928939629E9,
"TO" : "75YFHCGX8WQyP3qlyvQKNohgCvQ2"
}
},
"MAc9ouJnAacHddqDMRet3K9SkZq1" : {
"-LM9Oa1zGbRjdCERwoDX" : {
"FROM" : "AV4RFwIlSNdnryfPPCl6SfLOzBZ2",
"STAR" : 4,
"TIMESTAMP" : 1.536699031758939E9,
"TO" : "MAc9ouJnAacHddqDMRet3K9SkZq1"
}
}
我想使用子节点"STAR"进行计算
请,任何帮助将不胜感激!
问题是; 结构可能太深,您的代码与结构不匹配。
您正在观察具有两个子节点的"审阅"节点
Review
-75YFH...
-MAc9ou...
请记住,这些子节点也有子节点。
-7590W...
-LM90W...
-LM90o...
-MAc9ou...
-LM90a
for 循环在 -75YFH 和 -MAc9ou 的顶级子节点上循环 所以这段代码
let placeSnap = child as! DataSnapshot
let ratingsSnap = placeSnap.childSnapshot(forPath: "STAR")
真的是
let ratingsSnap = -75YFH.childSnapshot(forPath: "STAR")
和
let ratingsSnap = -MAc9ou.childSnapshot(forPath: "STAR")
正如你所看到的,STAR不是这些节点的子节点。
根据您的结构,在 -75YFH 和 -MAc9ou 的两个顶级节点中的每一个都需要另一个循环来迭代它们的子节点并检索 STAR 节点
var counter = 0
placesRef.observeSingleEvent(of: .value, with: { snapshot in
for child in snapshot.children { //this is -75YFH and -MAc9ou
let placeSnap = child as! DataSnapshot
for childOfPlace in placeSnap.children { //this is -LM90W and -LM90o
let childOfPlaceSnap = childOfPlace as! DataSnapshot
//let ratingsSnap = childOfPlaceSnap.childSnapshot(forPath: "STAR")
//I prefer the following...
let dict = childOfPlaceSnap.value as! [String: Any]
let val = dict["STAR"] as! Int
counter += val
}
}
print("total stars: (counter)") //or tableView.reloadData()
})
注意:在我的iPad上输入了该代码,因此未经测试,因此不要复制粘贴。这个概念是合理的。