Weitere ähnliche Inhalte
Ähnlich wie RxSwiftでの実装練習の記録ノートとはじめの一歩 (15)
Mehr von Fumiya Sakai (20)
Kürzlich hochgeladen (11)
RxSwiftでの実装練習の記録ノートとはじめの一歩
- 10. ✦ Observerパターンの基本的な構文と使い方を押さえておく
この書き方が良いのかは若干自信がないのですが、観測対象の定数に対して順繰りに値を加工・整形する。
挨拶文を作るプラクティスの実装ポイント
//セグメントコントロールにおいて、値変化のイベントを観測対象にする
let segmentedControlObservable: Observable<Int> = stateSegmentedControl.rx.value.asObservable()
//セグメントコントロールの値変化を検知して、その状態に対応するenumの値を返す
//(map)別の要素に変換する ※IntからStateへ変換
let stateObservable: Observable<State> = segmentedControlObservable.map {
(selectedIndex: Int) -> State in
return State(rawValue: selectedIndex)!
}
//enumの値変化を検知して、テキストフィールドが編集を受け付ける状態かを返す
//(map)別の要素に変換する ※StateからBoolへ変換
let greetingTextFieldEnabledObservable: Observable<Bool> = stateObservable.map {
(state: State) -> Bool in
return state == .useTextField
}
//(bindTo)イベントのプロパティ接続をする ※bindToの引数内に表示対象のUIパーツを設定
//(DisposeBag)観測状態からの解放を行う
greetingTextFieldEnabledObservable.bindTo(freeTextField.rx.isEnabled).addDisposableTo(disposeBag)
終端で観測状態の解除を行う
この中で観測対象の定数に対して処理を行なう(SegmentControlの状態)
★それぞれの定数を.asObservable()で観測対象とし、その値に対して加工を行う
この中で観測対象の定数に対して処理を行なう(入力モードの変換)
- 11. ✦ RxSwiftを用いることで下記のように書くことも可能
RxDatasourcesを使用して最終的にbindToでデータと紐づける(PresenterからのデータはすでにObservable)
UITableViewのDataSource部分の実装ポイント
//データソースを元にしてセルの生成を行う
dataSource.configureCell = {_, tableView, indexPath, ramens in
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = ramens.name
cell.detailTextLabel?.text = ramens.taste
cell.imageView?.image = ramens.image
return cell
}
//作成したデータと表示するUITableViewをBindして表示する
ramensData.ramens.bindTo(ramenTableView.rx.items(dataSource: dataSource)).addDisposableTo(disposeBag)
//RxSwiftを利用してUITableViewDelegateを適用する
ramenTableView.rx.setDelegate(self).addDisposableTo(disposeBag)
//データソースの定義を元にセクションヘッダーを生成する ※動画サンプルと形式が違う部分
dataSource.titleForHeaderInSection = { (ds, section: Int) -> String in
return ds[section].model
}
//データソースの定義
let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String, Ramen>>()
//Presenter層から表示するラーメンデータの取得
let ramensData = RamenPresenter()
★DataSource部分はRxTableViewSectionedDataSource<SectionModelを活用して記述