Мне нужно регулярно обновлять TableView, но при этом дублируются ячейки - PullRequest
0 голосов

У меня есть TableView, который я время от времени обновляю с помощью таймера, так что данные 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 ]

2 голосов
/ 22 мая 2019

Вам необходимо очистить массив перед выполнением другого наблюдения.

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

BTW .observe(.childAdded должен выполнять эту работу, поэтому вам может не понадобиться это делать

1 голос
/ 22 мая 2019

Наблюдатель, который вы использовали, возвращает все значения в указанном пути.Это закрытие вызывается, когда добавляется новый дочерний элемент.Но он получает все доступные по этому пути, а не только недавно добавленные данные.

Именно поэтому он генерирует гигантский TableView.

Таким образом, вам нужно получать только что добавленные данные, используя queryLimited(toLast: UInt)

databaseRef.child("A_Usuarios").queryOrdered(byChild: "TipoUsuario").queryEqual(toValue: "Empresa").queryLimited(toLast: 1).observe(.childAdded, with: { (snapshot) in
0 голосов
/ 22 мая 2019

В пожарной базе, если вы наблюдаете один и тот же узел 5 раз, он даст вам 5 событий.Итак, вы добавляете одну и ту же запись 5 раз.Таким образом, вы должны проверить, что вы уже наблюдаете этот узел, прежде чем наблюдать.Следующий код создает проблему.Каждый раз, когда вы вызываете updateTableView.Это добавление нового наблюдателя, и поэтому вы получаете одни и те же записи несколько раз.

    databaseRef.child("A_Usuarios").queryOrdered(byChild: "TipoUsuario").queryEqual(toValue: "Empresa").observe(.childAdded, with: { (snapshot) in
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...