# #ios #swift #firebase-realtime-database #searchbar
Вопрос:
Я использую firebase для хранения данных, теперь я хочу, чтобы, когда пользователь вводит имя в поисковике, он извлекал запись из firebase, но она не работает нормально.Также мне нужен ответчик клавиатуры при вводе пользователем.В классе сетевых служб есть функция, которая извлекает всех пользователей из firebase, и эта функция вызывается в классе разговоров.
Класс сетевого сервиса:
func getAllUsers(completion:@escaping(Result<[[String:String]],Error>)-> Void){
database.child("users").observeSingleEvent(of: .value) { (snapshot) in
guard let getUsers = snapshot.value as? [[String:String]] else {
completion(.failure(DatabaseEnum.failToFetch))
return
}
completion(.success(getUsers))
}
}
Новый класс преобразования:
var users : [[String:String]] = []
var userResult = [[String:String]]()
var searching = false
extension NewConversationController: UITableViewDelegate,UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
userResult.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
configureUserCell(tableView, cellForRowAt: indexPath)
}
func configureUserCell(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let userCell = tableView.dequeueReusableCell(withIdentifier: String(describing: UserCell.self)) as? UserCell else {return UITableViewCell()}
let obj = self.userResult[indexPath.row]
userCell.userData = obj["firstName"] as? String ?? ""
return userCell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at:indexPath, animated: true)
}
}
extension NewConversationController: UISearchBarDelegate{
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
print("you seach us (searchBar)")
searchBar.resignFirstResponder()
userResult.removeAll()
spinner.show(in: view)
searchUser(user: searchText)
}
func searchUser(user:String){
if searching{ //serching
filterCurrentUser(with: user)
}
else{
NetworkingService.shared.getAllUsers { (result) in
switch result{
case .success(let getData):
self.searching = true
self.users = getData
self.filterCurrentUser(with: user)
case .failure(let error):
print("failed to get data from db(error)")
}
}
}
}
func filterCurrentUser(with userDb:String){
guard searching else {return}
self.spinner.dismiss()
userResult = users.filter({
guard let name = $0["firstName"]?.lowercased() else {return false}
return name.hasPrefix(userDb.lowercased())
})
updateUI()
}
func updateUI(){
if userResult.isEmpty{
self.tableView.isHidden = true
}
else{
self.tableView.isHidden = false
self.tableView.reloadData()
}
}
}