我需要经常更新TableView,但是这样做会重复单元格

时间:2019-05-21 23:45:46

标签: ios swift firebase uitableview firebase-realtime-database

我有一个TableView,我会不定期地使用Timer进行更新,以便在必要时更改TableView的数据...发生的情况是更新了数据,但是重复了数据,没有消除它以前的数据,那么它将生成一个巨大的TableView。

如何使它们更新,但删除以前拥有的数据,并在更新表视图时仅保留新的单元格?

这是我在计时器中用于更新电视的代码:

 @objc func updatetableview(){
    databaseRef.child("A_Usuarios").queryOrdered(byChild: "TipoUsuario").queryEqual(toValue: "Empresa").observe(.childAdded, with: { (snapshot) in
       let key = snapshot.key
       self.snap = (snapshot.value as? NSDictionary)!
       self.snap.setValue(key, forKey: "Uid")
       self.city = self.snap["Ciudad"] as? String ?? ""
       self.activo = self.snap["Activo"] as? String ?? ""
       if self.city == self.cdad && self.activo != "No" {
         if(key == self.loggedInUser?.uid){
            print("Same as logged in user, so don't show!")
         }
         else
         {
           self.usersArray.append(self.snap)
           //insert the rows
           self.tableview.insertRows(at: [IndexPath(row:self.usersArray.count-1,section:0)],  with: UITableView.RowAnimation.automatic)
          }
        }

      }) { (error) in
             print(error.localizedDescription)
         }

希望您能帮助我,非常感谢!

3 个答案:

答案 0 :(得分:2)

您需要先清除阵列,然后再进行观察

@objc func updatetableview(){
 usersArray.removeAll()
 ....
}

BTW .observe(.childAdded应该可以完成工作,因此您可能不需要这样做

答案 1 :(得分:1)

您使用的观察者返回给定路径中的所有值。添加新的子级时,将调用此闭包。但是,它将获得该路径中的所有可用信息,而不仅仅是新添加的数据。

这就是为什么它会生成一个巨大的TableView的原因。

因此,您仅需要使用queryLimited(toLast: UInt)

来获取新添加的数据
databaseRef.child("A_Usuarios").queryOrdered(byChild: "TipoUsuario").queryEqual(toValue: "Empresa").queryLimited(toLast: 1).observe(.childAdded, with: { (snapshot) in

答案 2 :(得分:0)

在firebase中,如果您观察同一节点5次,那么它将给您5次事件。因此,您要添加5条相同的记录。因此,您需要在观察之前检查是否已经在观察该节点。以下代码创建了一个问题。每次调用updateTableView时。它正在添加新的观察者,这就是为什么您多次获得相同记录的原因。

    databaseRef.child("A_Usuarios").queryOrdered(byChild: "TipoUsuario").queryEqual(toValue: "Empresa").observe(.childAdded, with: { (snapshot) in