LoginSignup
11
11

More than 5 years have passed since last update.

【Swift】インクリメンタルサーチのリクエスト数を減らす

Last updated at Posted at 2017-06-05

インクリメンタルサーチ(incremental search)とは

検索バーに文字を入力する度に自動的に検索が行われる検索方法のことを指します。
インクリメンタルサーチという名前は知らなくてもどういう検索方法かは誰もが知っていると思います。

UISearchBarによる検索

UISearchBarDelegatesearchBar(_: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にリクエストを送る)ことができます。

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11