RxSwiftが難しい
「RxSwiftについていろんな記事を読みまくったけど、結局わからん」
その気持ちめっちゃわかります。
難しいですよね〜特に独学だとめちゃめちゃ辛い。
とりあえずRxSwiftはデータバインディングができて、
それを利用してMVVMなんかに使われることが多いです。
RxCocoaと併用しよう
RxSwiftはRxCocoaとよく併用されます。
ViewModel
ModelTypeでInputとOutputのプロトコルを返すことで、
viewModel.outputs.output、
viewModel.inputs.input
のようにそれがoutputsに登録したものなのか
inputsに登録したものなのかが明確になる。
extensionで準拠させよう。
inputsはViewControllerから受け取るイベントで、
受け取りなのでObserverを使う。
outputsはinputsでViewControllerから受け取ったイベントによって
処理をして、その結果をViewControllerに返すのでObservableを使う。
Observerは受信者(監視)、Observableは発信者であるので
それぞれoutputsとinputsで使い分けている。
output
let _output = BehaviorRelay<Bool>(value: false)
self.output = _output.asObservable()
//Observableを代入し変数outputを初期化している。
input
self.input = AnyObserver<Bool>() { bool in
//Observerなので、ViewControllerからinputに流れてきた
//イベントをここで受け取る。 boolはそのイベント。
_output.accept(bool)
//Observable(発信者)にイベントを発信させるには
//accept()を使う。
}
こんな感じで、ViewModelはVCからイベントをinputで受け取り、
outputで処理結果を返す感じに使う。
VCではinputでViewModelにイベントを送り、
outputを監視して処理結果に応じたUIの更新を行う。
ViewController
Instantiateを使うとbundleNameとか使わなくても、
storyboardを呼び出せる。(別々のstoryboardを使っていてもこれで一発なので超便利)
dependencyやinjectは依存性的な感じ。ここは自分で調べてください。
var viewModel: RxSwiftViewModelType!
//viewModelをModelTypeで型宣言してあげることで、
//inputs, outputs変数(プロトコル)を通さなければならなくなり、
//イベントがinputsなのかoutputsなのかはっきりする。(重要)
input
let _ = viewModel.inputs.input.onNext(true)
//ViewModelにイベントを送りたいときは、onNextメソッドを使う。
//画面更新が入る時など
output
let _ = viewModel.outputs.output
.subscribe(onNext: { [weak self] bool in
//viewModelからのイベント結果を監視し、イベントがきたら発火する
//weak selfはメモリリーク対策
guard let self = self else {return}
//guard let もメモリリーク対策
//イベント結果がきた時にしたい処理を書く
}).disposed(by: disposedBag)
//disposedBagを入れることで、購読の重複を防ぐ。
//(詳しくは調べてください)
遷移
instantiateライブラリを使っているので、遷移の仕方は少し特殊
この場合はnavigationControllerを使ったパターン。
まとめ
RxSwift、難しいですよね。
さらっとやったらあとは実務でゆっくり身に付けるのが一番効率が良さそうです。
ちなみに、RxSwiftの参考書なら RxSwift研究読本がおすすめです。