RxSwiftを調べてみました
最初に
swiftで非同期プログラミングをする時、RxSwiftとCombineを使用することができます。
今回はRxSwiftを調べてみました。
RxSwiftとは?
RxSwiftは、Reactive+eXtension+Swiftで観察可能なシーケンスを使用して非同期およびイベントベースのプログラムを構成するためのライブラリです。
- reactivex.io
- RxSwift Github
Swiftは関数型プログラミング(Functional Programming)パラダイムを強調する言語です。
これに対してRxSwiftは反応型プログラミング(Reactive Programming)を加えて、SwiftでFRP(Functional Reactive Programming)に従うことができるようにします。
Observable
.combineLatest(firstName.rx.text, lastName.rx.text) { $0 + " " $1 }
.map { "Greetings, \(#0)" }
.bind(to: greetingLabel.rx.text)
.disposed(by: DisposeBag)
combine Latest や map を RxSwift から Operator と呼びます。
これらの演算子を使用して、イベントの値をさまざまな形で組み合わせたり変更したりすることができます。
また、MVVMパターンを適用する際、ViewとViewModelを接続するデータバインディングを行わなければならないです。
この時、bind演算子を使って簡単にバインディングが可能です。
Dispatch Queueなどで直接調整が必要な作業を自動的に処理してくれます。
なぜRxSwiftを使うか?
API通信をしてみると、成功する時もあるが失敗する時も確かに存在します。
func doSomethingIncredible(forWho: String) throws -> IncredibleThing
失敗した時に単純に終わるのではなく、3回くらいやり直せたらいいですね。
しかし、再試行コードは非常に複雑で、再利用できない状態が存在する可能性もあります。
RxSwiftを使えばretry演算子を使って簡単に再試行コードを作成することができます。
doSomethingIncredible("me")
.retry(3)
Swiftでは非同期処理のために色んなAPIを提供。
- NotificationCenter
- The delegate pattern
- Grand Central Dispatch(GCD)
- Closure
一般的に、ほとんどのクラス、UI は非同期的に動作します。 したがって、どのようなコードを作成したとき、正確にどのような順序で動作するかを仮定できないです。
ユーザの入力、ネットワーキング、その他OS イベントなど様々な外部要因により、全く異なる順序で動作することができます。
上記のようなapiによる複合的な非同期コードは、開発者が追跡する上で困難になります。
状況の例
viewWillAppearで複数の関数を実行するように作成されているコードがあると仮定します。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
makeUI()
connectUIControls()
fetchData()
checkForChanges()
}
connectUIControls()はUIコンポーネントを制御するための関数です。
この関数が実行され、ビューを変更すると、変更を起点にその前後が異なる状態になります。
ここで問題は、私たちが制御できるかどうかです。
それぞれのコードに対して該当コードが付随的にどのような作用をするのか、過程/結果を発生させるのかなど、我々が認知することが重要です。
RxSwiftを使えば、より直観的かつ効率的に非同期コードを作成することができます。
それだけでなく、このようなイシューを追跡できるようにします。
RxSwiftの利点
RxSwiftは次のような利点を提供します。
- Composable
- Reusable
- Declarative
- Understandable and concise
- Stable
- Less stateful
- Without leaks
Discussion