У меня есть панель поиска, которая ищет имена пользователей из моей базы данных Firebase. Он отлично работает, но работает только один раз. Например, если я введу «Test», все результаты для «Test» появятся, но если я продолжу вводить тестирование, и collectionView не ограничивает себя, чтобы показывать только результаты для нового запроса, он по-прежнему показывает всестарые данные, несмотря на то, что я вызываю collectionView.reloadData
.
Примечание: если я распечатываю снимок в fetchUsers, он вызывается и возвращает правильный снимок (ы)
fileprivate func fetchUsers(username: String) {
let ref = Database.database().reference().child("users").queryOrdered(byChild: "username").queryStarting(atValue: username).queryEnding(atValue: "\(username)\u{f8ff}")
ref.observeSingleEvent(of: .value) { (snapshot) in
guard let dictionaries = snapshot.value as? [String: Any] else { return }
dictionaries.forEach({ (key, value) in
if key == Auth.auth().currentUser?.uid {
return
}
guard let userDictionary = value as? [String: Any] else { return }
let user = User(uid: key, dictionary: userDictionary)
if self.fetchedUserIds.contains(key) {
return
} else {
self.users.append(user)
self.fetchedUserIds.append(key)
}
})
self.users.sort(by: { (user1, user2) -> Bool in
return user1.username.compare(user2.username) == .orderedAscending
})
self.collectionView?.reloadData()
}
}
Функция панели поиска
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.isEmpty {
self.fetchedUserIds.removeAll()
self.users.removeAll()
self.filteredUsers.removeAll()
} else {
fetchUsers(username: searchText)
}
self.collectionView.reloadData()
}