从firebase数据库检索计算平均值

我正在创build一个使用地名和评分的iOS应用程序。 我已经使这个事情工作。 我的意思是,我把数据保存到我的数据库,我也可以读取它们。 唯一的问题是,当我读他们,我想他们加载我的tableviewcell,通过计算每个地方的平均值。 看截图,如果你不明白的地方,请让我编辑答案。

的TableView

的TableView

火力地堡

火力地堡

我的代码,加载数据到tableview

import UIKit import FirebaseDatabase class PlacesTableViewController: UITableViewController { //MARK: Properties @IBOutlet weak var placesTableView: UITableView! var dbRef:FIRDatabaseReference? var places = [Places]() private var loadedLabels = [String: String]() private var loadedRatings = [String: Int]() override func viewDidLoad() { super.viewDidLoad() dbRef = FIRDatabase.database().reference() // Loads data to cell. loadData() } override func numberOfSections(in tableView: UITableView) -> Int { return 1 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { //return the number of rows return places.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // Table view cells are reused and should be dequeued using a cell identifier. guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? PlacesTableViewCell else { fatalError("The dequeued cell is not an instance of PlacesTableView Cell.") } let place = places[indexPath.row] cell.placeLabel.text = place.name cell.ratingControl.rating = place.rating return cell } private func loadData() { dbRef!.observe(.childAdded, with: { (placeSnapshot) in //print("Adding place \(placeSnapshot.key)...") let labels = placeSnapshot.childSnapshot(forPath: "placeLabel") for (key, label) in labels.value as! [String: String] { self.updatePlace(key, label: label) } let ratings = placeSnapshot.childSnapshot(forPath: "rating") for (key, rating) in ratings.value as! [String: Int] { self.updatePlace(key, rating: rating) } }) } private func updatePlace(_ key: String, label: String? = nil, rating: Int? = nil) { if let label = label { loadedLabels[key] = label } if let rating = rating { loadedRatings[key] = rating } guard let label = loadedLabels[key], let rating = loadedRatings[key] else { return } if let place = Places(name: label, rating: rating) { places.append(place) placesTableView.reloadData() } } } 

地点迅速

 import UIKit class Places { //MARK: Properties var name: String var rating: Int //MARK:Types struct PropertyKey { static let name = "name" static let rating = "rating" } //MARK: Initialization init?(name: String, rating: Int) { // Initialize stored properties. self.name = name self.rating = rating // Initialization should fail if there is no name or if the rating is negative. // The name must not be empty guard !name.isEmpty else { return nil } // The rating must be between 0 and 5 inclusively guard (rating >= 0) && (rating <= 5) else { return nil } } } 

这是一个相当详细的答案,但它会遍历评级节点的子节点并计算平均值

 let parentRef = self.dbRef.child("Paradosiako - Panorama") let ratingRef = parentRef.child("rating") // rating node ratingRef.observe(.value, with: { snapshot in let count = snapshot.childrenCount var total: Double = 0.0 for child in snapshot.children { let snap = child as! FIRDataSnapshot let val = snap.value as! Double total += val } let average = total/Double(count) print(average) }) 

编辑

遍历所有的地方,并获得平均值,这里的代码

 let placesRef = self.dbRef.child("akapnapp") placesRef.observeSingleEvent(of: .value, with: { snapshot in for child in snapshot.children { let placeSnap = child as! FIRDataSnapshot let ratingsSnap = placeSnap.childSnapshot(forPath: "rating") let count = ratingsSnap.childrenCount var total: Double = 0.0 for child in ratingsSnap.children { print(child) let snap = child as! FIRDataSnapshot let val = snap.value as! Double total += val } let average = total/Double(count) print(average) } }) 

并显示代码的输出正常工作。 我的孩子节点被命名为a,b,c而不是问题中的childByAutoId,但它可以工作。

 Snap (a) 3 Snap (b) 3 3.0 Snap (a) 2 Snap (b) 4 Snap (c) 5 3.67 

据我了解,你希望有一个四舍五入你的应用程序,而不是一个双。 只需更改loadData()函数内部的代码即可。 你也会像你一样调用updatePlace() 。 请批准周杰伦的回答,他写的代码。

 private func loadData() { dbRef!.observe(.childAdded, with: { (placeSnapshot) in let parentRef = self.dbRef?.child(placeSnapshot.key) let ratingRef = parentRef?.child("rating") ratingRef?.observe(.value, with: { snapshot in let count = snapshot.childrenCount var total: Double = 0.0 for child in snapshot.children { let snap = child as! FIRDataSnapshot let val = snap.value as! Double total += val } let average = total/Double(count) print("Average for \(placeSnapshot.key) = \(Int(round(average)))") self.updatePlace("" , label: placeSnapshot.key, rating: Int(round(average))) }) }) }