はじめに
随時更新予定
今回は、オンラインサロンでRxSwiftを教えてもらっているので、その中で自分の学びになったことを簡潔にまとめてみたいと思います。
学んだこと
・どれがBLなのかを考える
・Result型で値を返すことができる
enum CalculateError: Error {
case numberToDivideIsZero
}
func calculate(num1: Double, num2: Double) -> Result<Double, CalculateError> {
if num2.isZero {
return .failure(.numberToDivideIsZero)
}
return .success(num1 / num2)
}
let num1 = 10.0
let num2 = 0.0
switch calculate(num1: num1, num2: num2) {
case .success(let result):
print(result)
case .failure(let error):
print(error)
}
・メインスレッドで実行したいものには、Driverを使う(イベントをながすものはRelay)
・Driverをbindするときは、drive(onNext:)を使う
・Relayはaccept()でイベント通知する
relay.accept("text")
・Alertなどはイベントとして、enumを用意する
enum Event {
case showAlert(String)
}
・BehaviorとPublishの使い分け
Behavior: 現在地を表したい場合に使う(subscribeした時点で現在地を取得できるため)
例: ラベルへの表示
Publish: イベントを表したい場合に使う(subscribeした時点で最後の値が流れてこないから)
例: アラートの表示要求
UIに表示したいストリームの源流をPublishで表した場合、subscribeした後に新たにEventが流れてこないとUI表示が更新されない。
アラート表示要求に使いたいストリームの源流をBehaviorで表した場合、subscribeした時点より前に流したEventが流れてしまうので余分にアラート表示がなされてしまうことになる。
・MVVMにおけるViewは状態を持たない。
・MVVMにおけるViewModelはViewを描画するための状態の保持と、Viewから受け取った入力を適切な形に変換してModelに伝達する役目を持つ。すなわちViewとModelの間の情報の伝達と、Viewのための状態保持のみを役割とする要素である。
・viewDidLoadにも処理を書かない(ViewModelにやらせる)
override func viewDidLoad() {
super.viewDidLoad()
viewModel.viewDidLoad()
setupBindings()
}
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
おわりに
おわりです。