我有一个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)
}
希望您能帮助我,非常感谢!
答案 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