Быстрый поиск по автозаполнению - PullRequest
0 голосов
/ 17 октября 2019

Я создал приложение, в котором пользователи могут искать сообщения (созданные пользователями) в приложении. Недавно дошло до того, что я не могу загрузить всех пользователей одновременно без сбоев.

Старая функция просто загружает весь узел post и затем фильтрует, как показано ниже. Можно ли воспроизвести что-то похожее на это с гораздо большим количеством данных?

 self.posts.filter { (post) -> Bool in
 return 
 post.title.lowercased().contains(searchText.lowercased())
 }

Я создал новую функцию из чтения документации Firebase. Который предназначен для обработки большего количества данных.

Новая функция

var users = [User]()

fileprivate func fetchUsers(username: String) {

    let ref = Database.database().reference().child("users").queryOrdered(byChild: "username").queryStarting(atValue: username).queryEnding(atValue: "\(username)\\uf8ff")
    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)
            self.users.append(user)

        })

        self.users.sort(by: { (user1, user2) -> Bool in

            return user1.username.compare(user2.username) == .orderedAscending
        })

        self.collectionView?.reloadData()

        }
    }

База данных Firebase

 "users" : {
   "0Udc81ELBJP7UpYiESqPj5gLDx9A" : {
    "username" : "First_User"
  },
  "13ThJZlpkgUCcZ4zaRzzaAHFjat2" : {
    "username" : "Test_User"
 }
 },

Эта функцияоднако он вялый и не выполняет автозаполнение, как раньше (аналогично тому, как это делает Instagram). Вам нужно набрать полные слова в строке поиска, прежде чем что-либо появится.

Я предполагаю, что есть способ иметь панель автозаполнения поиска, так как она в настоящее время стандартна для большинства приложений. Любая помощь в исправлении этого приветствуется.

1 Ответ

1 голос
/ 18 октября 2019

Я предполагаю, что вы звоните fetchUsers каждый раз, когда пользователь меняет текст в окне поиска.

В этом случае вам нужно будет удалить предыдущее содержимое из списка пользователей при каждом запуске fetchUsers. Так что-то вроде:

func fetchUsers(username: String) {

  let ref = Database.database().reference().child("users").queryOrdered(byChild: "username").queryStarting(atValue: username).queryEnding(atValue: "\(username)\\uf8ff")
ref.observeSingleEvent(of: .value) { (snapshot) in
    guard let dictionaries = snapshot.value as? [String: Any]
        else { return }

    self.users.removeAll() // clear all previous results

    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)
        self.users.append(user)

    })

    self.users.sort(by: { (user1, user2) -> Bool in

        return user1.username.compare(user2.username) == .orderedAscending
    })

    self.collectionView?.reloadData()

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...