SlideShare a Scribd company logo
1 of 32
オブジェクト指向な人が
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 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を
起点とした、スタンダードな
オブザーバーパターンの拡張」
と紹介がされています。
観察する人
Observer Subject
観察対象
ここで
オブザーバーパターンを復習すと、
notify
観察対象のオブジェクトの変化を
観察者のオブジェクトが観察する
というパターンでした。
観察する人
Observer Observable
観察対象
ReactiveXだと、
subscrive
観察対象はObservableと呼ばれ、
観察者はObservarとなります。
Observableから値(element)が
Observerへどんどん流れてくる設計になってま
す。
用語は異なるところがありますが、
だいたい同じ構造と理解しました。
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
バッファ
《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

More Related Content

What's hot

Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
Sphinxで作る貢献しやすいドキュメント翻訳の仕組みSphinxで作る貢献しやすいドキュメント翻訳の仕組み
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
Takayuki Shimizukawa
 
Rubyistのためのkotlin紹介
Rubyistのためのkotlin紹介Rubyistのためのkotlin紹介
Rubyistのためのkotlin紹介
豊明 尾古
 

What's hot (20)

Detroit Programming City
Detroit Programming CityDetroit Programming City
Detroit Programming City
 
Movable Type Data API連携!店舗情報を地図に表示させよう!
Movable Type Data API連携!店舗情報を地図に表示させよう!Movable Type Data API連携!店舗情報を地図に表示させよう!
Movable Type Data API連携!店舗情報を地図に表示させよう!
 
The World is Connected
The World is ConnectedThe World is Connected
The World is Connected
 
進撃の受託開発
進撃の受託開発進撃の受託開発
進撃の受託開発
 
Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014
 
私が見てきたあるセカイの物語 Part I & II
私が見てきたあるセカイの物語 Part I & II私が見てきたあるセカイの物語 Part I & II
私が見てきたあるセカイの物語 Part I & II
 
Source kittenについて
Source kittenについてSource kittenについて
Source kittenについて
 
SIerでもSphinxを使いたい!総括
SIerでもSphinxを使いたい!総括SIerでもSphinxを使いたい!総括
SIerでもSphinxを使いたい!総括
 
SIerでもSphinxを使いたい! 前編
SIerでもSphinxを使いたい! 前編SIerでもSphinxを使いたい! 前編
SIerでもSphinxを使いたい! 前編
 
0831 node学園lt
0831 node学園lt0831 node学園lt
0831 node学園lt
 
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
Sphinxで作る貢献しやすいドキュメント翻訳の仕組みSphinxで作る貢献しやすいドキュメント翻訳の仕組み
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
 
Rails Tokyo 035 Cucumber
Rails Tokyo 035 CucumberRails Tokyo 035 Cucumber
Rails Tokyo 035 Cucumber
 
Laravel Meetup Tokyo Vol.3 告知 LT
Laravel Meetup Tokyo Vol.3 告知 LTLaravel Meetup Tokyo Vol.3 告知 LT
Laravel Meetup Tokyo Vol.3 告知 LT
 
Kotlinの紹介
Kotlinの紹介Kotlinの紹介
Kotlinの紹介
 
Rubyistのためのkotlin紹介
Rubyistのためのkotlin紹介Rubyistのためのkotlin紹介
Rubyistのためのkotlin紹介
 
進撃のSbt
進撃のSbt進撃のSbt
進撃のSbt
 
Rodから聞いたことを全部話すぜ
Rodから聞いたことを全部話すぜRodから聞いたことを全部話すぜ
Rodから聞いたことを全部話すぜ
 
FreeWnn に patch が送られてきた、どうしよう
FreeWnn に patch が送られてきた、どうしようFreeWnn に patch が送られてきた、どうしよう
FreeWnn に patch が送られてきた、どうしよう
 
【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js
 
Spring I/O 2017での拡張のお話
Spring I/O 2017での拡張のお話Spring I/O 2017での拡張のお話
Spring I/O 2017での拡張のお話
 

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

Similar to オブジェクト指向な人がRx swiftを試してみた (20)

The History of Reactive Extensions
The History of Reactive ExtensionsThe History of Reactive Extensions
The History of Reactive Extensions
 
Reactive programming with Apache Wicket
Reactive programming with Apache WicketReactive programming with Apache Wicket
Reactive programming with Apache Wicket
 
RxSwift x APIKit
RxSwift x APIKitRxSwift x APIKit
RxSwift x APIKit
 
Reactive Systems と Back Pressure
Reactive Systems と Back PressureReactive Systems と Back Pressure
Reactive Systems と Back Pressure
 
Reactつかってみた
ReactつかってみたReactつかってみた
Reactつかってみた
 
SwaggerとAPIのデザイン
SwaggerとAPIのデザインSwaggerとAPIのデザイン
SwaggerとAPIのデザイン
 
初めてのRxSwift
初めてのRxSwift初めてのRxSwift
初めてのRxSwift
 
SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc.
SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc.SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc.
SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc.
 
React.js・ReactNative・Redux入門
React.js・ReactNative・Redux入門React.js・ReactNative・Redux入門
React.js・ReactNative・Redux入門
 
Storybook web-and-circleci
Storybook web-and-circleciStorybook web-and-circleci
Storybook web-and-circleci
 
クラスメソッド第4回登壇資料 RxRealm
クラスメソッド第4回登壇資料 RxRealmクラスメソッド第4回登壇資料 RxRealm
クラスメソッド第4回登壇資料 RxRealm
 
WebエンジニアのReactNativeでの戦い方
WebエンジニアのReactNativeでの戦い方WebエンジニアのReactNativeでの戦い方
WebエンジニアのReactNativeでの戦い方
 
Reactive Extensionの紹介
Reactive Extensionの紹介Reactive Extensionの紹介
Reactive Extensionの紹介
 
Realm,rx swift,repro を使ってみて
Realm,rx swift,repro を使ってみてRealm,rx swift,repro を使ってみて
Realm,rx swift,repro を使ってみて
 
javascript を Xcode でテスト
javascript を Xcode でテストjavascript を Xcode でテスト
javascript を Xcode でテスト
 
SIROK技術勉強会 #1 「Reactってなんだ?」
SIROK技術勉強会 #1 「Reactってなんだ?」SIROK技術勉強会 #1 「Reactってなんだ?」
SIROK技術勉強会 #1 「Reactってなんだ?」
 
React Native + Expoでアプリを開発してみた話
React Native + Expoでアプリを開発してみた話React Native + Expoでアプリを開発してみた話
React Native + Expoでアプリを開発してみた話
 
今日から始めるRxSwift
今日から始めるRxSwift今日から始めるRxSwift
今日から始めるRxSwift
 
Testing react-native with storybook on web
Testing react-native with storybook on webTesting react-native with storybook on web
Testing react-native with storybook on web
 
iOSでMVVM入門
iOSでMVVM入門iOSでMVVM入門
iOSでMVVM入門
 

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