Ответ 1
Я сделал что-то подобное в своем приложении для поиска контактов. Я буду псевдокодировать это, чтобы вы поняли концепцию:
1) Захват символов, введенных в текстовое поле конечным пользователем
2) При вводе некоторого количества символов решает запросить сервер для возврата всех записей, которые соответствуют - выберите подходящий вам счет (я выбрал около 3-4 символов). Меньше возвращается больше, больше возвращается менее очевидно... до вас, перфекционные и UX-соображения.
3) Поместите результаты этого запроса сервера в массив на клиенте. Это будет ваш суперсет, из которого вы будете предлагать предложения пользователю.
4) После каждого последующего символа, введенного в текстовое поле, вы теперь фильтруете массив (array.filter()) по символьной строке, введенной в эту точку.
5) tableView.reloadData() для фильтрованного массива при каждом введенном символе.
6) Я использую переменную dataFlag, чтобы определить, какой источник данных будет отображаться в представлении таблицы, в зависимости от того, что делает пользователь.
Примечание. Вы только запрашиваете сервер один раз, чтобы свести к минимуму влияние на производительность.
// this function is called automatically when the search control get user focus
func updateSearchResults(for searchController: UISearchController) {
let searchBar = searchController.searchBar
if searchBar.text?.range(of: "@") != nil {
self.getUserByEmail(searchBar.text!)
}
if searchController.searchBar.text?.characters.count == 0 && dataFlag != "showParticipants" {
dataFlag = "showInitSearchData"
self.contacts.removeAll()
self.participantTableView.reloadData()
}
if dataFlag == "showInitSearchData" && searchController.searchBar.text?.characters.count == 2 {
self.loadInitialDataSet() {
self.dataFlag = "showFilteredSearchData"
}
}
if dataFlag == "showFilteredSearchData" {
self.filterDataForSearchString()
}
}
// filter results by textfield string
func filterDataForSearchString() {
let searchString = searchController.searchBar.text
self.filteredContacts = self.contacts.filter({
(contact) -> Bool in
let contactText: NSString = "\(contact.givenName) \(contact.familyName)" as NSString
return (contactText.range(of: searchString!, options: NSString.CompareOptions.caseInsensitive).location) != NSNotFound
})
DispatchQueue.main.async {
self.participantTableView.reloadData()
}
}