Skip to main content

RxSwiftを使ってUISearchBarに入力した文字を取得する

iOSでandroidでいうところのRxBindingを使いたいと思った
調べたらRxSwiftを使えば出来そうなのでやってみた


・CocoaPods

pod 'RxSwift', '~> 5.1.1'
pod 'RxCocoa', '~> 5.1.1'

・コード

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController, UISearchBarDelegate {
    @IBOutlet weak var searchBar: UISearchBar!
    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        searchBar.text = "masterka!"
        searchBar.rx.text.orEmpty
            .throttle(.milliseconds(300), scheduler: MainScheduler.instance)
            .distinctUntilChanged()
            .flatMapLatest { query -> Observable<String> in
                print("1:" + query)
                return .just(query)
        }
        .observeOn(MainScheduler.instance)
        .subscribe(onNext: { string -> Void in
            print(string)
        })
            .disposed(by: disposeBag)
    }    
}

・コードの解説
throttleは以下なので時間を最初の引数に、そしてscheduler当ててる
.millisecondsみたいな「.」から始まるの慣れないなぁ

public func throttle(_ dueTime: RxTimeInterval, latest: Bool = true, scheduler: SchedulerType)

flatMapLastestの解説は以下
最後に来たObservableで上書きされるらしい
https://qiita.com/akihisasen/items/96fb48050d94393962a2

 

参考
https://github.com/ReactiveX/RxSwift
https://dev.classmethod.jp/articles/incremental-search-using-rxswift-and-rxcocoa/

関連記事:

Pocket