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/