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/