swift - 如何检索 firebase 数据库值来计算平均值

标签 swift firebase dictionary firebase-realtime-database

我一直在尝试创建一个社交应用程序,允许人们对其他人进行评分。我已经能够检索并显示每条评论的评分,但我很难获得所有评分来计算平均值。

这是我的代码:

 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 节点

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 上输入的,因此未经测试,因此请勿复制粘贴。这个概念很合理。

关于swift - 如何检索 firebase 数据库值来计算平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52435629/

相关文章:

ios - 全新安装后第二次启动时 FirebaseApp.configure() 崩溃

Angular Firebase 函数部署错误 : Cannot find module 'firebase/app'

ios - 适合 MKMapView 部分的注释

swift - Swift 中的 MapKit

Swift 的内存管理

swift - 在 UITextView 中切换 selectedRange 属性

python - 添加字典而不是覆盖 - defaultdict

ios - 有没有办法从 TextView 中删除用户指定的行?

java - 将来自 Api 响应的数据添加到 Android 中的 Firebase 数据库中

javascript - 如何使用 Javascript 对象/ map 作为队列