RxSwiftの導入には希望もあれば不安もあると思います。実際、RxSwiftを導入したプロジェクトでの開発では、良いことばかりではなく問題にも直面しました。しかし、プロジェクトに参加してから半年以上たった現在では、やはりRxSwiftを導入して良かったと実感しています。
本トークでは、RxSwiftを利用して実際にどのようなコードを書いてきたのか、実例を交えて紹介します。
RxSwiftは開発をどう変えたか?
メルカリの新規事業チームで働いています。
使ったことがある方
かなりいますね
まだ触ったこと無い方どのくらいおられますか
半々ぐらいでしょうか
今日の話の内容は基本的な概念の、アプリのイベントの扱いがどう変わるかのはなしをします。
ひとことで言うとイベントストリームを抽象化するライブラリです。UITextFieldが編集されたとか。
たとえばテキスト入力はこのように変化します。
この一連の流れをイベントストリームと呼びます。
イベントストリームをこう表現します。
たとえばテキストの変化
このようにiOS SDK の各種イベントをObservableで取得できます。
Observableの個々のイベントの取得の仕方
サンプルコードが動いている様子
もう一つBindToというのもあります。
上がUITextField、下がUILabel、上から下に反映されます。
おさらい
Operator
実際の開発ではObservableを加工してObserverにバインドすることになる。
MapやFlatMapはおなじみだと思います。Mapの例を見てみます。
こうすると入力した文字数がカウントされて表示されます。
もっと実践的な例。
Submitすると下に表示される
オペレータによって二つのTextFieldの最新の値を組み合わせて表示する。
片方編集する度イベントが発生して更新されてしまうが、buttonでsampleすることで先程のような動きになる。
アプリが作れる気がしてきましたか?
どんな違いがあるか見てみましょう。
Rxの場合
ViewDidLoadでバインドするだけで終わる。ViewDidLoadですべての実装が終わるというのは
あんまりピンときていないですか?
こういうものを組み合わせて水の流れを作るのがRxのやり方。
先ほどの水道のイメージでもう一度見てみましょう
こうやって組んでおいたら、あとは勝手に流れる。
targetActionのイメージ
テキストのインプットとボタンのタップは従来だと同じイベントとして扱えないので組み合わせにくい。 Rxでは貯めておいたり取りに行ったりすることがない。
実際に取りに行くの面倒なのでランダムな天気を返します
認可状態と位置情報の二つが変動するが、その二つが変動しても嬉しくないので一つの型にします。本当は中間状態が発生するが、最終的に許可されたかされていないかだけにまとめました。
ボタントリガーのハンドリング。IBActionを用意してメソッドを呼ぶ。
ちょっと複雑ですよね
ボタンが押されて
アラート表示して
デリゲートが来て
APIを叩いて
最後にここ
Rx の場合
のつもりだったけど書いてきました
最新ロケーションの取得をStaticメソッドで用意。
ロケーションの変化について記述
ちょっと複雑かもしれないですけどこっちの世界に来たら大したことないですよ
ついにViewControllerに来ました。
認可されていればAPI、認可されていなければNoneを返す。複数回使うのでShareReplay(1)。
LocationStatusにはdescriptionというステータスがあるのでそれをラベルにバインド。weatherも。
別々に更新されると気持ち悪いのでweatherでsampleしている。
出来上がり。
何が嬉しいか。処理の流れが終えるということ。どういう順序で何が起きているのかここだけ見れば分かる
まとめ
デリゲートパターンやtargetActionだと最新の状態をStoredPropertyに貯めないといけない、そういうのがなくなるのも良い。
本書いてます!!
今年とは言っていない、冬に出します!よろしくお願いします。
Q&A
コード量、実用的なものを作った時に増えるでしょうか、減るでしょうか
イメージでは総量は増えるかもしれない。Observerを出すまでは多いかもしれないが、Controllerは減るのではないか、大きく増えるわけではなく、なっても1.5倍程度だと思う。
前半でConbineLatestの例があったと思います、Sampleで実行を制限しているが、combineLatestのところは毎回実行される?
Sampleの下に行くものが制限されるので、おそらく毎回実行されます。チャタリングを抑える仕組みもあるのでそれでうまくいくかもしれないです。
従来型イベントハンドリングと、Rx、全部Rxでやるのか、混在することもあるのでしょうか
全面的に使っていてほとんどObservableだが、なりきっていないところもある。普通のプロパティとしても扱えるしObservableにもなるようなVariableという型?があってそれで間を埋めているような形になっている。
感想
twitter.comああ、そうかこれがFRPってことなのか。
— ダンボー田中@味噌汁への憎しみ (@ktanaka117) August 20, 2016
メモリに保持しておくということが発生しないって感じ?#iosdc #a
twitter.com#iosdc #a Enumをばりばり作って状態をMECEに管理していくスタイル、とても好き
— takasek (@takasek) August 20, 2016
— ワニ (@alligator_tama) August 20, 2016twitter.com
twitter.comRx もそうだけど、それ以外の部分でもishkawaさんのコードが美しい。 #iosdc #a
— ほんとは超いそがし松 (@himara2) August 20, 2016
twitter.comRxSwiftだけじゃなくてReactiveCocoaもありますよ! #iosdc #a
— Syo Ikeda / いけしょー (@ikesyo) August 20, 2016
twitter.com夕方にはSwift 3やUIバインドにも対応したReactiveCocoa 5.0のLTをします #iosdc #a https://t.co/gSdu8N5Ysw
— Syo Ikeda / いけしょー (@ikesyo) August 20, 2016
まとめ
twitter.com「RxSwiftは開発をどう変えたか?-抽象的なRxSwiftの考え方を学ぶ- #iosdc #a」をトゥギャりました。 https://t.co/dZ10M67UtP
— トゥギャッター開発まとめ (@tg__dev) August 20, 2016