インクリメンタルサーチ(incremental search)とは
検索バーに文字を入力する度に自動的に検索が行われる検索方法のことを指します。
インクリメンタルサーチという名前は知らなくてもどういう検索方法かは誰もが知っていると思います。
UISearchBar
による検索
UISearchBarDelegate
にsearchBar(_:textDidChange:)
というメソッドがあります。
このメソッドはUISearchBar
に入力された文字列が変更される度に呼ばれます。
よって次のようにAPIを叩くのが一般的かと思います。
class ViewController: UIViewController {
...
}
extension ViewController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
// send a request to API and show the response
}
}
しかし、これでは、文字が入力される度にAPIにリクエストを送ってしまうので、無駄なリクエストが多くなってしまいます。
具体的には、「あいうえお」と入力すると、5回連続でAPIにリクエストを送ってしまいます。
これではサーバにかかる負荷も大きくなってしまいますし、ユーザ体験もよろしくありません。
解決方法
上のコードを次のように修正します。
class ViewController: UIViewController {
...
var timer: Timer?
...
}
extension ViewController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
self.timer?.invalidate()
self.timer = Timer.scheduledTimer(timeInterval: 0.3, target: self, selector: #selector(self.search), userInfo: nil, repeats: false)
}
func search() {
// send a request to API and show the response
}
}
こうすると、searchBar
の文字列に変更が連続で生じたときでも、0.3秒以内の連続入力であれば、最終的に入力した文字列に対してのみ検索を行う(APIにリクエストを送る)ことができます。