はじめに
私はRxSwiftを業務で使うことになったので勉強を始めましたが、Rxの世界を知るためのバックグラウンドがほぼゼロの状態でしたので概念を理解するのに非常に苦労しました。
今となってはWebに溢れているRxの解説記事はわかりやすいと思えますが、はじめはチンプンカンプンで凄いイライラしました。私と同じような経験をしてほしくないため、同じようにRxの世界に疎い人向けに、これさえ知っといたらとりあえず勉強を進めることができるし、挫折しないはず、という思いを込めて記事を書きました。ある程度Swiftを使用している方向けになると思います。
RxSwiftとは?
RxSwiftを知るにはRxを理解しておく必要があります。RxとはReactive Extensionsの略で非同期処理やイベント処理などを宣言的に記述することができる便利ライブラリです。RxSwiftという一つの概念ではなく、RxのSwift実装なのでRxSwiftと言います。2009年からRxの開発が始まっており、またC#でLINQというのがあって、それと似た概念なので、知っている人からするとRxはそこまで特別なものではないらしいです。ですので、RxSwift自体を何かものすごい難しいものと思い込むことをやめて、「なんだ。すでにある考え方だったらブログにも書いてある人多いだろうしなんとかなるだろう」という気持ちを持ってハードルを下げていくことが大事だと思います。
なぜRxが必要なのか
筆者がRxSwiftを使い始めた理由はある意味業務命令でした(笑) 特になんでそれが必要かの説明を受けずに、知らぬ間に導入されていたので、自分から能動的にRxを使い始めたわけではありません。ですが、今となってはそれがないと書けない状態になってしまっており、個人プロジェクトでも導入しています。なので他の方にも薦めたい気持ちでいっぱいですし、現にこうして布教の記事を書いています(笑)
ですが、いきなりRxSwiftの虜になったわけではなく、勉強するモチベーションが湧くまでにある程度時間を要しました。知らない事ばっかりですし新しいことを覚えるのは大変ですし(笑) ですので、なんでRxが必要なのかを説明して、これからRx(RxSwift)を使ってみようと思う方の後押しをしたいと思います。
まずは Rx入門(1) - はじめに を読むとわかりやすいです。
近年のアプリケーションの高度化は凄まじいものがあります。ユーザーはその進化にどんどん慣れていき、より新しいもの、かっこいいもの、快適なものを求めるようになります。特に "快適" というのは非常に重要な要素で、使っていてストレスの溜まるようなアプリケーションはどんどん嫌われ、淘汰されていきます。昨今ではTwitterなどのSNSの影響もあり、口コミで良いもの/悪いものの差が広がりやすい環境にあります。
みなさんも経験があるかと思いますが、ほんの1~2秒フリーズしているように感じるだけでもムッとするものです。処理が長くて待たせる必要があるのならば、進捗を表示するなどの細かい工夫が必要です。このように、ユーザーに対してよりよいUX (特に快適さ) を提供するには、アプリケーションの非同期処理が欠かせません。
しかし、非同期処理はUIに同期的な処理に比べてとても面倒なだけでなく、同期処理にはない非同期処理特有の問題が発生する可能性もあります。何よりデバッグがしづらいため、バグが出ても原因の特定に時間がかかるなどの問題もあります。ユーザーの要求は当然のことではあるものの、その実装がどれほど骨の折れるものか...と考えてしまいます。
また、時間に関する処理も同じく非常に手間です。典型的なタイマーはまだ簡単な方ですが、例えば「頻繁に発生するイベントのうち、X秒の間に発生した最後の1回だけを処理する」などと言ったことをしようとすると、途端に話がややこしくなります。
「もっと簡単に書ければ良いのに...」
このように感じることは多々あることでしょう。ここで登場するのがReactive Extensions (Rx) です。
この引用文にある通り、非同期処理はコードが品雑になり、時間などのイベント処理の扱いもややこしいのでRxを使って簡潔に書きましょうという話です。ですが、これを読んだとしても自分が過去に非同期処理をたくさん書いて苦労した経験がないとピンと来ないと思うので、そういう方はまずはコールバック地獄などについて調べてみたり、APIを叩いて返ってきた結果を利用してまたAPIを叩くなどの処理を書いてみて、コードが品雑になる経験をしていく中でRxの必要性を徐々に実感していくのが良いかと思います。
Rxの利点
ReactiveCocoaなど他にも似たようなライブラリがあるんじゃないの?と思う方もいるでしょうが、なぜRxが良いのかというと、RxSwift at first sight に
It's the most commonly used implementation of the reactive paradigms. A difference compared to other RP libraries is that given it's cross-platform, it has the biggest community, tons of documentation and discussions available and a lot of people contributing.
と書かれています。RxSwiftの他にも、RxJava、RxJSなどがあるので今回RxSwiftを使い、将来的にAndroidアプリを開発することになったとしても、RxJava(RxKotlin)を使うことで新たに覚えることが少なくて済むという利点があります。また、色々な言語で使われているということはそれだけドキュメントが豊富なので勉強も捗ります。
関数型リアクティブプログラミング(FRP)に関して
Rxに関して色々調べていると、FRP、関数型、リアクティブプログラミングなどの単語を目にすると思います。 【翻訳】あなたが求めていたリアクティブプログラミング入門を読んでなんとなく理解できるぐらいで何とかなるとは思いますし、細かいこと気にせずにまずはRxに慣れていくほうが大事だとは思います。習うより慣れろの精神で、とりあえず使いこなせるようになってから概念的なことの理解をしていくほうが良い方法だと思います。
ObservableとObserverに関して
RxではObservableという言葉がめちゃくちゃ出てきますしそれが全てと言っても過言ではないです。背景知識としてGoFのデザインパターンのObserverパターンを知っておきましょう。RxでのObservableというのはRxで初めて使われた概念ではなく、Observerパターンですでに使われています。まずはそれを学びましょう。それが理解できれば特にObservable, Observerの意味を理解するのに苦しみません。
RxCocoaに関して
RxSwiftの他にRxCocoaがあります。これはUIKitを扱うために必要です。とりあえず両方セットで使うものと覚えておき、とりあえずサンプルコードをひたすら写経することで慣れていきましょう。実践として考えると、RxCocoaの使い方を覚えることのほうが大事な気がします。UIButtonのタップイベントをラップしたrx_tapなどが典型的です。
頻出単語
- subscribeNext (subscribe)
- onNext, onError, onComplete
- DisposeBag, Dispose
- Variable
- asObservable
- addDisposableTo
- bindTo
- rx_tap, rx_text
- map, filter
Hot, Cold
Rxを理解するにおいてHotとColdが大事という記事がたくさん出てきますが、正直書いていく中でサンプルを真似て書くだけならばそこまで理解していなくても大丈夫だと思いますが、頑張って理解しましょうw RxのHotとColdについて とか参考になるかと思います。
参考になる記事で打線組んだ
1番 右 RxSwiftでUIKitを扱う基本
2番 二 #RxSwift
3番 三 RxExample
4番 一 Rx.playground
5番 中 RxMarbles
6番 左 RxSwiftを用いたアプリ開発の実践
7番 遊 RxSwiftドキュメント日本語化
8番 捕 Rx逆引き
9番 投 Functional Reactive Programming with RxSwift
さいごに
RxSwiftははじめは大変ですが慣れると書くのがとても楽しくなるので二週間は辛抱して頑張ってください。この記事が励みになれば幸いです。