Count Firebase Database children and display

时间:2018-12-19 11:32:25

标签: ios swift firebase firebase-realtime-database

I programmed a tableView which displays posts from my Firebase database. In my sidebar (before the user gets to the tableView) I added a label which should display the number of Posts displayed in the tableView, so the user knows if there's something inside. So my question is: How can I track the number of children, stored under my topic "offers" and display them in my counterLbl?

var ref: DatabaseReference!
ref = Database.database().reference()

ref.child("offers").observe(.childAdded, with: { snapshot in

counterLbl.text = ...
}

2 个答案:

答案 0 :(得分:1)

如果您已经在听.childAdded,则可以保留一个计数器并将其递增:

var nodeCount: Int = 0

ref.child("offers").observe(.childAdded, with: { snapshot in
    nodeCount = nodeCount + 1
    counterLbl.text = String(nodeCount)
}

如果您的用例还可以将节点从数据库中删除,则还应该侦听.childRemoved来减少计数器的数量:

ref.child("offers").observe(.childRemoved, with: { snapshot in
    nodeCount = nodeCount - 1
    counterLbl.text = String(nodeCount)
}

更高级的场景

请注意,此方法要求您下载要计数的所有节点。在您当前的情况下,这应该可以正常工作,因为无论如何您都在下载所有优惠。但是随着获取更多数据,您可能只想读取/显示商品的一个子集,在这种情况下,上面的代码将只计算该子集中的节点。

在这种情况下,如果您仍然希望所有商品的计数,通常的方法是在数据库中保留一个单独的计数器值,该计数器值在每次添加/删除商品时都会更新。有关更多信息,请参见:

答案 1 :(得分:0)

步骤1。 用您要存储的值创建一个类

class ListModel: NSObject {
    var UID:String?
    var Name:String?
    var Email:String?
}

第2步。 在您的ViewController中,添加以下代码

var ListArr = [ListModel]()


let ref = Database.database().reference().child("offers")
ref.observe(.childAdded, with: { (snapshot) in
    print(snapshot)
    guard let dictionary = snapshot.value as? [String : AnyObject] else {
       return
   }
   let Obj = ListModel()
   Obj.UID = snapshot.key
   Obj.Name = dictionary["name"] as? String
   Obj.Email = dictionary["email"] as? String

   self.ListArr.append(Obj)
   self.myTableView.delegate = self
   self.myTableView.dataSource = self
   self.myTableView.reloadData()

}, withCancel: nil)