Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
オブジェクト指向な人が
RxSwiftを試してみた
Twitterアカウント:grachro
2000年
初頭から、だいたいずっとJava
2014年
Oisix iPhoneアプリ立ち上げで
設計とプログラミングを担当
2016年
最近はPythonとかKotlinの開発もやってます
自己紹介
ReactiveSwift
ReactiveCocoa
RxSwift
RxCocoa
PromiseKit
ReactKit
SwiftTask
今回関数型のプログラム用のライブ
ラリをいくつか調べてみて、個人的に
RxSwiftが一番しっく...
目次
RxSwiftがしっくりきた
理由3つ
書いてみた
デザインパターンの
オブザーバーパターン
で理解が可能
RxSwiftがしっくりきた理由
その1
http://reactivex.io/documentation/observable.html
Composition via Observable Operators
Observables and observers are only ...
観察する人
Observer Subject
観察対象
ここで
オブザーバーパターンを復習すと、
notify
観察対象のオブジェクトの変化を
観察者のオブジェクトが観察する
というパターンでした。
観察する人
Observer Observable
観察対象
ReactiveXだと、
subscrive
観察対象はObservableと呼ばれ、
観察者はObservarとなります。
Observableから値(element)が
Obse...
RxSwiftがしっくりきた理由
その2
メソッドチェーンでかける
RxSwiftのコード例。
RxSwiftでは観察対象が返すオブジェク
トを観察部分がメソッドチェーン形式で
変更していきます。
Observable 観察対象
Observer
観察部分
いっけんすると
10年以上前にはやった、
「流れるようなインターフェース」
(命名、マーティンファウラー先生)
ぽいので
オブジェクト指向な人でも関数型プログラ
ムの敷居が半減します。
実際はメソッドチェーン中に型が
変わっていくので、それほど単純ではありません。
またこの形式は関数型のライブラリで
よく見られる形なので、
特にRxSwift固有の特性という
わけではありません。
RxSwiftがしっくりきた理由
その3
マーブル図で
UMLだと難しいタイムライン
がわかりやすくなる
観察対象
観察者1
観察者2
マーブル図の例です。
右向きの矢印が時間の流れを表していて、
上下のラインが観察対象と観察者の
関係を表しています。
RxSwiftのドキュメントはマーブル図
を使って説明されています。
このダイアグラムでUMLだと表現しにくかった
時間の経過がシンプルに表現できるようになりま
す。
以上をふまえて
実際に使いたい
シチュエーションを
想定して
RxSwiftを
試してみました。
タップしたら
すぐに時間がかかる
ネットワーク処理を実行
ボタンは連続タップできる
ネットワーク処理は直列で実行
その間タップされた情報はキャッシュして
次のタイミングでまとめて送信
終わったら
順次、処理結果を表示
想定シチュエーション
3 2 1
ネットワーク処理
3 2 1
バッファ
《1》
今回
この処理をRxSwift
で
どうなるかを
試行錯誤しました。
マーブル図で書く
とこうなります。
1つめの
観察対象
と
観察者
2つめの
観察対象
と
観察者
PublishSubject
Obserbver
Obserbver
Publish
Subject
観察対象と観察者のペアを
2つ連続させています
3 2 1
ネットワーク処理
...
3 2 1
ネットワーク処理
3 2 1
バッファ
《1》
最初に
タップされた情報を
Observableの一種の
PublishSubjectに
順次追加していきます。
1
3 2 1
UIButtonをタップしたら、
数値をSujectに追加(onNext)します。
rx_tapはRxCocoaの機能です。
RxCocoaはRxSwiftと同時に使えるライブラリで、
UIKitのクラスでRxSwiftを使える...
1つ目の観察物に
追加された情報は
1つ目の観察者に
順次送られていき
ます。
3 2 1
ネットワーク処理
3 2 1
バッファ
《1》
実際のコードがこちら
最初のovserveOnで以降の処理をバックグラウ
ンドで実行するようにします。
これで連続タップができるようになります。
3 2 1
ネットワーク処理
3 2 1
バッファ
_queue:Subject
次の2行で
前のネットワーク
処理を待っている
間に溜まった
情報をバッファさ
せています。
bufferを使うと
溜まった値は配列で送ら
れるようになりまが、
一定間隔で空配列も
送られてくるので
filterしています。
3 2 1
buffer
filter
3 2 1
3 2 1
ネットワーク処理
3 2 1
_serverResult:Subject
次のflatMapで
ネットワーク処理
をします。
《1》
ネットワーク部分は詳細は省略します。
非同期を直列にする処理はRxSwiftだと
やり方が見つけられなかったので
基本ライブラリでとめます。
サーバ処理結果は
新しいObsarvableにくるまれて、
次の観察値として渡されます。
ネットワーク処理
3 2 1
ネットワーク処理の
結果を2つめの観察対象
に追加して、
1つめの観察処理は終了。
《1》
3 2 1
ネットワーク処理
3 2 1
バッファ
《1》
2つ目の観察対象が
ネットワーク処理
結果を返すようにな
ります
最後に2つめの観察者(ここではUILabel)が
観察して、観察値をラベルに表示。
ここでもRxCocoaのbindToを使います。
《1》《2⚡️3》
今回やってみた感想
正しいコードかはともかくRxSwiftを使
うと非同期処理を使うコードがかなりシ
ンプルにかけた。
エラー処理を入れるとどうなるかは課題。
とわ言え、ライブラリの全体像を把握す
るのは時間がかかり、サンプルコード以
上のこと...
ご清聴
ありがとうございました
今回のコードはgithubにあげてます
https://github.com/grachro/RxSwiftSample
Upcoming SlideShare
Loading in …5
×

オブジェクト指向な人がRx swiftを試してみた

2,471 views

Published on

iOS Creators' Meetup vol.2 LT枠スライド
http://oi-study.connpass.com/event/40049/

Published in: Engineering
  • Be the first to comment

オブジェクト指向な人がRx swiftを試してみた

  1. 1. オブジェクト指向な人が RxSwiftを試してみた
  2. 2. Twitterアカウント:grachro 2000年 初頭から、だいたいずっとJava 2014年 Oisix iPhoneアプリ立ち上げで 設計とプログラミングを担当 2016年 最近はPythonとかKotlinの開発もやってます 自己紹介
  3. 3. ReactiveSwift ReactiveCocoa RxSwift RxCocoa PromiseKit ReactKit SwiftTask 今回関数型のプログラム用のライブ ラリをいくつか調べてみて、個人的に RxSwiftが一番しっくり来たので 試してみました。
  4. 4. 目次 RxSwiftがしっくりきた 理由3つ 書いてみた
  5. 5. デザインパターンの オブザーバーパターン で理解が可能 RxSwiftがしっくりきた理由 その1
  6. 6. http://reactivex.io/documentation/observable.html Composition via Observable Operators Observables and observers are only the start of ReactiveX. By themselves they’d be nothing more than a slight extension of the standard observer pattern, better suited to handling a sequence of events rather than a single callback. 公式サイトでは、 超訳ですが、 「ObservablesとObserversを 起点とした、スタンダードな オブザーバーパターンの拡張」 と紹介がされています。
  7. 7. 観察する人 Observer Subject 観察対象 ここで オブザーバーパターンを復習すと、 notify 観察対象のオブジェクトの変化を 観察者のオブジェクトが観察する というパターンでした。
  8. 8. 観察する人 Observer Observable 観察対象 ReactiveXだと、 subscrive 観察対象はObservableと呼ばれ、 観察者はObservarとなります。 Observableから値(element)が Observerへどんどん流れてくる設計になってま す。 用語は異なるところがありますが、 だいたい同じ構造と理解しました。
  9. 9. RxSwiftがしっくりきた理由 その2 メソッドチェーンでかける
  10. 10. RxSwiftのコード例。 RxSwiftでは観察対象が返すオブジェク トを観察部分がメソッドチェーン形式で 変更していきます。 Observable 観察対象 Observer 観察部分
  11. 11. いっけんすると 10年以上前にはやった、 「流れるようなインターフェース」 (命名、マーティンファウラー先生) ぽいので オブジェクト指向な人でも関数型プログラ ムの敷居が半減します。
  12. 12. 実際はメソッドチェーン中に型が 変わっていくので、それほど単純ではありません。 またこの形式は関数型のライブラリで よく見られる形なので、 特にRxSwift固有の特性という わけではありません。
  13. 13. RxSwiftがしっくりきた理由 その3 マーブル図で UMLだと難しいタイムライン がわかりやすくなる
  14. 14. 観察対象 観察者1 観察者2 マーブル図の例です。 右向きの矢印が時間の流れを表していて、 上下のラインが観察対象と観察者の 関係を表しています。
  15. 15. RxSwiftのドキュメントはマーブル図 を使って説明されています。 このダイアグラムでUMLだと表現しにくかった 時間の経過がシンプルに表現できるようになりま す。
  16. 16. 以上をふまえて 実際に使いたい シチュエーションを 想定して RxSwiftを 試してみました。
  17. 17. タップしたら すぐに時間がかかる ネットワーク処理を実行 ボタンは連続タップできる ネットワーク処理は直列で実行 その間タップされた情報はキャッシュして 次のタイミングでまとめて送信 終わったら 順次、処理結果を表示 想定シチュエーション
  18. 18. 3 2 1 ネットワーク処理 3 2 1 バッファ 《1》 今回 この処理をRxSwift で どうなるかを 試行錯誤しました。 マーブル図で書く とこうなります。
  19. 19. 1つめの 観察対象 と 観察者 2つめの 観察対象 と 観察者 PublishSubject Obserbver Obserbver Publish Subject 観察対象と観察者のペアを 2つ連続させています 3 2 1 ネットワーク処理 3 2 1 バッファ 《1》
  20. 20. 3 2 1 ネットワーク処理 3 2 1 バッファ 《1》 最初に タップされた情報を Observableの一種の PublishSubjectに 順次追加していきます。
  21. 21. 1 3 2 1 UIButtonをタップしたら、 数値をSujectに追加(onNext)します。 rx_tapはRxCocoaの機能です。 RxCocoaはRxSwiftと同時に使えるライブラリで、 UIKitのクラスでRxSwiftを使えるようにる。
  22. 22. 1つ目の観察物に 追加された情報は 1つ目の観察者に 順次送られていき ます。 3 2 1 ネットワーク処理 3 2 1 バッファ 《1》
  23. 23. 実際のコードがこちら 最初のovserveOnで以降の処理をバックグラウ ンドで実行するようにします。 これで連続タップができるようになります。
  24. 24. 3 2 1 ネットワーク処理 3 2 1 バッファ _queue:Subject 次の2行で 前のネットワーク 処理を待っている 間に溜まった 情報をバッファさ せています。
  25. 25. bufferを使うと 溜まった値は配列で送ら れるようになりまが、 一定間隔で空配列も 送られてくるので filterしています。 3 2 1 buffer filter 3 2 1 3 2 1
  26. 26. ネットワーク処理 3 2 1 _serverResult:Subject 次のflatMapで ネットワーク処理 をします。 《1》
  27. 27. ネットワーク部分は詳細は省略します。 非同期を直列にする処理はRxSwiftだと やり方が見つけられなかったので 基本ライブラリでとめます。 サーバ処理結果は 新しいObsarvableにくるまれて、 次の観察値として渡されます。
  28. 28. ネットワーク処理 3 2 1 ネットワーク処理の 結果を2つめの観察対象 に追加して、 1つめの観察処理は終了。 《1》
  29. 29. 3 2 1 ネットワーク処理 3 2 1 バッファ 《1》 2つ目の観察対象が ネットワーク処理 結果を返すようにな ります
  30. 30. 最後に2つめの観察者(ここではUILabel)が 観察して、観察値をラベルに表示。 ここでもRxCocoaのbindToを使います。 《1》《2⚡️3》
  31. 31. 今回やってみた感想 正しいコードかはともかくRxSwiftを使 うと非同期処理を使うコードがかなりシ ンプルにかけた。 エラー処理を入れるとどうなるかは課題。 とわ言え、ライブラリの全体像を把握す るのは時間がかかり、サンプルコード以 上のことをやる敷居は高かった。
  32. 32. ご清聴 ありがとうございました 今回のコードはgithubにあげてます https://github.com/grachro/RxSwiftSample

×