RxSwift 使用メモ#
RxSwift の一般的なメソッドの使用方法をここに記録します。
RxSwfit での検索の実装#
distinctUntilChanged
の役割は、隣接する重複したイベントが新しいイベントを生成しないようにすることです。そのため、検索ではdistinctUntilChanged
を使用すると、毎回トリガされる検索が異なる文字列であることが保証され、入力が停止した後には 1 回の検索のみがトリガされることも保証されます。
throttle
とdebounce
の違い:
throttle
は一定の時間ごとに呼び出されます。debounce
はイベントが停止した後、何秒後に呼び出されます。
したがって、入力中の検索を実装する場合は、throttle
を使用します。
fileprivate func configureSearch() {
searchBar.rx.text
.orEmpty
.throttle(1.0, scheduler: MainScheduler.instance)
.distinctUntilChanged()
.subscribe { [unowned self] (query) in
}.disposed(by: disposeBag)
}
一方、入力が停止した後の検索を実装する場合は、debounce
を使用します。
fileprivate func configureSearch() {
searchBar.rx.text
.orEmpty
.distinctUntilChanged()
.debounce(0.5, scheduler: MainScheduler.instance)
.subscribe { [unowned self] (query) in
}.disposed(by: disposeBag)
}
RxSwift でのクリックの実装#
button.rx.tap
.subscribe(onNext: {
print("ボタンがタップされました")
})
.disposed(by: disposeBag)
RxSwift でのデリゲートの実装#
scrollView のデリゲート#
override func viewDidLoad() {
super.viewDidLoad()
scrollView.rx.contentOffset
.subscribe(onNext: { contentOffset in
print("contentOffset: \(contentOffset)")
})
.disposed(by: disposeBag)
}
tableView のデリゲート#
fileprivate func setupVM() {
vm.dataList
.bind(to: tableView.rx.items(cellIdentifier: Cell.CellIdentifier, cellType: Cell.self)) { _, model, cell in
cell.model = model
}
.disposed(by: disposeBag)
Observable
.zip(tableView.rx.itemSelected, tableView.rx.modelSelected(CellModel.self))
.subscribe(onNext: { [weak self] indexPath, item in
self?.handleSelectItem(at: indexPath, model: item)
})
.disposed(by: disposeBag)
vm.pageNum
.subscribe(onNext: { [weak self] pageNum in
self?.loadData(pageNum)
})
.disposed(by: disposeBag)
vm.isLastPage
.subscribe(onNext: { [weak self] isLastPage in
self?.tableView.mj_header?.endRefreshing()
if isLastPage {
self?.tableView.mj_footer?.endRefreshingWithNoMoreData()
} else {
self?.tableView.mj_footer?.endRefreshing()
}
})
.disposed(by: disposeBag)
}
RxSwift での通知の実装#
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.rx
.notification(.UIApplicationWillEnterForeground)
.subscribe(onNext: { (notification) in
print("アプリがフォアグラウンドに入ります")
})
.disposed(by: disposeBag)
}
RxSwift でのネットワークリクエストの統合#
flatMapLatest
は、複数のタスクが依存関係を持つ場合に使用され、コールバック地獄を避けるためのものです。
/// ユーザー名とパスワードを使用してユーザー情報を取得する
API.token(username: "beeth0ven", password: "987654321")
.flatMapLatest(API.userInfo)
.subscribe(onNext: { userInfo in
print("ユーザー情報の取得に成功しました: \(userInfo)")
}, onError: { error in
print("ユーザー情報の取得に失敗しました: \(error)")
})
.disposed(by: disposeBag)
zip
は、複数のリクエストを同時に送信し、すべてのリクエストが完了した後に次の処理を行うために使用できます。
combineLatest
は、複数のリクエストを同時に送信し、各リクエストが完了するたびに処理イベントがトリガされます。
参考: