Как проверить и удалить дубликаты значений в TableView? - PullRequest
0 голосов
/ 05 января 2019

У меня есть база данных на Firebase и таблица. У меня есть список брендов, моделей и год выпуска мотоциклов, и я хочу получить список брендов из таблицы.

Проблема в том, что БД имеет дублирующиеся значения. Существует более одного мотоцикла от Suzuki, больше моделей SV 650 и т. Д.

Как я могу проверить дубликаты значений, поместить их в новый массив и извлечь их в виде таблицы?

Это мой файл TableViewController:

import UIKit
import FirebaseAuth
import FirebaseDatabase

class SelectionMarqueViewController: UITableViewController {
    var posts = [Post]()

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = self
        loadMarques()
    }

    func loadMarques() {
        var ref : DatabaseReference?
        ref = Database.database(url: "https://myride-test.firebaseio.com/").reference()
        ref?.observe(.childAdded, with: { (snapshot) in
            if let dict = snapshot.value as? [String: Any] {
                let MarqueText = dict["Marque"] as! String
                let post = Post(MarqueText: MarqueText)
                self.posts.append(post)
                print(self.posts)
                self.tableView.reloadData()
            }
        })
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return posts.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath)
        cell.textLabel?.text = posts[indexPath.row].Marque
        return cell
    }
}

А это файл с функцией Post:

import Foundation

class Post {
    var Marque: String

    init(MarqueText: String) {
        Marque = MarqueText
    }
}

Вот моя база данных Firebase:

https://ibb.co/X5fwyqK

На самом деле в табличном представлении представлен полный список брендов в БД, и, следовательно, во многих случаях одни и те же бренды.

На БД и код: «Марка» соответствует марке.

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Проверьте и добавьте, если маркировка недоступна в источнике данных таблицы.

func appendMarqueAndReloadIfNeeded(_ marque: String) {
  if self.posts.map({ $0.Marque }).contains(marque) {
    // Do nothing
  } else {
    self.posts.append(Post(MarqueText: marque))
    self.tableView.reloadData()
  }
}

Тогда вы называете это внутри observe:

///....
if let dict = snapshot.value as? [String: Any] {
  let MarqueText = dict["Marque"] as! String
  self.appendMarqueAndReloadIfNeeded(MarqueText)
}
///....
0 голосов
/ 05 января 2019

Вы можете реализовать Hashable

class Post : Hashable {
    var marque: String

    init(marqueText: String) {
        marque = marqueText
    }
    // Equatable for contains
    static func == (lhs:Post,rhs:Post) -> Bool {
      return lhs.marque == rhs.marque
    }
   // Hashable for Set
   var hashValue:Int {
    return marque.hashValue
   }

}

и используйте

if let dict = snapshot.value as? [String: Any] {
   let MarqueText = dict["Marque"] as! String
   let post = Post(MarqueText: MarqueText)
   self.posts.append(post)
   self.posts = Array(Set(self.posts))
   print(self.posts)
   self.tableView.reloadData()
 }

Или просто

let marqueText = dict["Marque"] as! String 
if !self.posts.map { $0.marqueText}.contains(marqueText) {
   let post = Post(marqueText:marqueText)
   self.posts.append(post)
   self.tableView.reloadData()
}
...