Как реализовать поиск UISearchBar из firestore в табличном представлении?

#ios #swift #firebase #google-cloud-firestore

#iOS #swift #firebase #google-облако-firestore

Вопрос:

Я хочу реализовать функцию поиска в своем приложении. Я хочу, чтобы, когда пользователь ищет определенный магазин в строке поиска, он выполнял поиск в базе данных firestore и заполнял tableview конкретным магазином, который он ввел.

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

вот мой код до сих пор:

  func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        
        filteredShops = []
        db.collection("Shops").whereField("name", isLessThanOrEqualTo: searchText).addSnapshotListener{ (query, error) in
            if error != nil {return}
            guard let doucments = query?.documents else {return}
            for doc in doucments {
                
                self.sName = doc["name"] as? String
                self.sLoc = doc["location"] as? String
                self.sImg = doc["ShopHeaderImg"] as? String
                
                self.filteredShops.append(self.sName!)
                self.filteredShops.append(self.sLoc!)
                self.filteredShops.append(self.sImg!)
                
                
            }
        }
        print("is typing")
    }
}




extension SearchTableViewController: UITableViewDataSource {
    
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return filteredShops.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = searchTV.dequeueReusableCell(withIdentifier: "searchShop")! as UITableViewCell
        
        cell.textLabel?.text = filteredShops[0]
        return cell
    }
    
   

}
  

как я могу реализовать это с помощью базы данных firestore?

Комментарии:

1. Вы спрашиваете, как запрашивать базу данных или как отображать результат?

2. @Pancho пожалуйста, просмотрите мой отредактированный вопрос, я спрашиваю, как запросить базу данных и отобразить результат правильным образом. приведенный выше метод, который я показываю, не сработал для меня.

Ответ №1:

Ну, вот какой-то псевдокод

Создайте себе что-то, с чем легче работать, чтобы оно служило вам моделью данных

    struct Shop {
       let name: String?
       let location: String?
       let image: String?
  
       init(from document: Document) {
           name = document["name"] as? String
           location = document["location"] as? String
           image = document["ShopHeaderImg"] as? String
       }
   }
  

Затем в вашем контроллере представления добавьте источник данных

 var shops: [Shop] = []
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    db.collection("Shops")
      .whereField("name", contains: searchText)
      .addSnapshotListener { [weak self] (query, error) in
        // make sure you capture self weak as it may lead to memory leak
        guard let self = self, let documents = query?.documents else { return }           
        // simply transform your Documents to Shops and update your dataSource
        self.shops = documents.map { Shop(from: $0) }
        // Reload your table view and show the result
        self.tableView.reloadData()
    }
  }
}

extension SearchTableViewController: UITableViewDataSource {

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

   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       let cell = searchTV.dequeueReusableCell(withIdentifier: "searchShop")! as UITableViewCell
       let shop = shops[indexPath.row]
       cell.textLabel?.text = shop.name
       return cell
   }
}
  

Комментарии:

1. удивительный ответ, теперь он работает. есть ли способ, с помощью которого я могу сделать так, чтобы он начинался с префикса? итак, если пользователь начнет вводить «St», в начале будут отображаться все магазины с префиксом «St»?

2. Взгляните на документацию о том, как запрашивать ее. Я не слишком знаком с firestore