Upload
Download free for 30 days
Login
Submit Search
freee社でのReactiveCocoa活用例
23 likes
23,495 views
yo_waka
ReactiveCocoa Tokyoで発表した資料です。
Technology
Read more
1 of 33
Download now
Downloaded 17 times
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
More Related Content
PDF
var RAC3 = ReactiveCocoa + Swift @ ReactiveCocoa Tokyo #rac_tokyo 10/18
Syo Ikeda
PDF
RxJava on Android
yo_waka
PDF
Ruby風Swift NSOperation編
Hisakuni Fujimoto
PDF
Sansan様 登壇資料
Daisuke Nagata
PDF
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
株式会社ランチェスター
PPTX
Wpfと非同期
yone64
PPTX
本当にあった怖い話し (やきに駆動 2.0)
Oda Shinsuke
PDF
Rx java x retrofit
Shun Nakahara
var RAC3 = ReactiveCocoa + Swift @ ReactiveCocoa Tokyo #rac_tokyo 10/18
Syo Ikeda
RxJava on Android
yo_waka
Ruby風Swift NSOperation編
Hisakuni Fujimoto
Sansan様 登壇資料
Daisuke Nagata
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
株式会社ランチェスター
Wpfと非同期
yone64
本当にあった怖い話し (やきに駆動 2.0)
Oda Shinsuke
Rx java x retrofit
Shun Nakahara
What's hot
(20)
PDF
React入門-JSONを取得して表示する
regret raym
PDF
Miyazaki.js vol.1 スコープの話
Nobuhiro Nakashima
PDF
TypeScript 言語処理系ことはじめ
Yu Nobuoka
PDF
ECMAScript6による関数型プログラミング
TanUkkii
PDF
Postgresql advent calender 2014 using jsonb by ecpg
Toshi Harada
PPTX
Retrofit2 &OkHttp でAndroidのHTTP通信が快適だにゃん
removed_96f4639f4009e61a478bf38f188e8404
PDF
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
Tomohiro Kumagai
KEY
Starting java fx
Kazuhiro Eguchi
PPTX
20111204 WebBroser Control Tips for Windows Phone
Kenji Wada
PPTX
JAWS-UG CLI #14 LT 【”Waiters”機能の使いドコロ】
Ayumi Kobukata
PDF
これからのJavaScriptー関数型プログラミングとECMAScript6
TanUkkii
PDF
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
PPTX
Jsonp
Kiminari Homma
PDF
WebAPIのバリデーションを、型の力でいい感じにする
Takuya Kikuchi
PDF
明日から使える Java SE 7
Yuichi Sakuraba
PDF
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
y_taka_23
PDF
Unit testing JavaScript with JUnit/JavaFX
Shinya Mochida
PDF
初級者向けレッスン 51回 ─── 例外
higaki
PDF
scala-kaigi1-sbt
Kenji Yoshida
PPTX
まだDOM操作で消耗してるの?
IRI MO
React入門-JSONを取得して表示する
regret raym
Miyazaki.js vol.1 スコープの話
Nobuhiro Nakashima
TypeScript 言語処理系ことはじめ
Yu Nobuoka
ECMAScript6による関数型プログラミング
TanUkkii
Postgresql advent calender 2014 using jsonb by ecpg
Toshi Harada
Retrofit2 &OkHttp でAndroidのHTTP通信が快適だにゃん
removed_96f4639f4009e61a478bf38f188e8404
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
Tomohiro Kumagai
Starting java fx
Kazuhiro Eguchi
20111204 WebBroser Control Tips for Windows Phone
Kenji Wada
JAWS-UG CLI #14 LT 【”Waiters”機能の使いドコロ】
Ayumi Kobukata
これからのJavaScriptー関数型プログラミングとECMAScript6
TanUkkii
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
Jsonp
Kiminari Homma
WebAPIのバリデーションを、型の力でいい感じにする
Takuya Kikuchi
明日から使える Java SE 7
Yuichi Sakuraba
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
y_taka_23
Unit testing JavaScript with JUnit/JavaFX
Shinya Mochida
初級者向けレッスン 51回 ─── 例外
higaki
scala-kaigi1-sbt
Kenji Yoshida
まだDOM操作で消耗してるの?
IRI MO
Ad
Viewers also liked
(15)
PDF
Android meets RxJava - 渋谷Java#6
yo_waka
PDF
エンジニア戦記 〜小さなチーム、大きな未来〜
Yuki Hirai
PDF
iOS 通信のパフォーマンス改善 ・ iOSオールスターズ登壇資料
yohei sugigami
PDF
効率的なアプリ開発のベストプラクティス
yayugu
PDF
minne の API 改善
Toshihiro Gotou
PDF
インフラで実践したチームビルディングそれはサバ天
ume3_
PDF
ライブコーディング・Androidのライブラリを作ってみよう
Masataka Kono
PDF
10年続いているwebサービスの画像サーバをノーメンテでftpサーバからs3互換のストレージサーバに移行している話
Masataka Kono
PDF
WatchKitを実際にさわってみてわかったこと
Shuichi Tsutsumi
PDF
Railsチュートリアルの歩き方 (第4版)
Yohei Yasukawa
PDF
Information sharing and Experience consistency at Cookpad mobile application
ichiko_revjune
PDF
Ruby 2.4 Internals
Koichi Sasada
PDF
distinctUntilChanged の使いどころ
正之 安宅
PDF
DevOps tools for everyone - Vagrant, Puppet and Webmin
postrational
PDF
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
Masataka Kono
Android meets RxJava - 渋谷Java#6
yo_waka
エンジニア戦記 〜小さなチーム、大きな未来〜
Yuki Hirai
iOS 通信のパフォーマンス改善 ・ iOSオールスターズ登壇資料
yohei sugigami
効率的なアプリ開発のベストプラクティス
yayugu
minne の API 改善
Toshihiro Gotou
インフラで実践したチームビルディングそれはサバ天
ume3_
ライブコーディング・Androidのライブラリを作ってみよう
Masataka Kono
10年続いているwebサービスの画像サーバをノーメンテでftpサーバからs3互換のストレージサーバに移行している話
Masataka Kono
WatchKitを実際にさわってみてわかったこと
Shuichi Tsutsumi
Railsチュートリアルの歩き方 (第4版)
Yohei Yasukawa
Information sharing and Experience consistency at Cookpad mobile application
ichiko_revjune
Ruby 2.4 Internals
Koichi Sasada
distinctUntilChanged の使いどころ
正之 安宅
DevOps tools for everyone - Vagrant, Puppet and Webmin
postrational
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
Masataka Kono
Ad
Similar to freee社でのReactiveCocoa活用例
(20)
PDF
Sendai.html5#2
Reoto Wakabayashi
PDF
Dev for Citizen Manual
テスト データ
PDF
中・大規模でLaravelを導入するTips
Kenjiro Kubota
KEY
MVCもやもや話
Tetsuya Kaneuchi
PDF
サーバーからiOSアプリを変更する
toyship
PDF
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
Fumiya Sakai
PPTX
Angular js はまりどころ
Ayumi Goto
PPTX
Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】
WESEEKWESEEK
PDF
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
Tomoki Oyamatsu
PDF
SwiftとCocoaPodsで始めるサクサクiOS開発!
Koji Shiraishi
PDF
ROS JAPAN Users Group Meetup 03
Daiki Maekawa
PDF
jQuery Mobile
yoshikawa_t
PDF
APIMeetup 20170329_ichimura
Tomohiro Ichimura
PDF
Progressive Framework Vue.js 2.0
Toshiro Shimizu
PDF
MTDDC Meetup HOKKAIDO 2013 KEYNOTE - Movable Type 6
Daiji Hirata
PDF
OpenLineage による Airflow のデータ来歴の収集と可視化(Airflow Meetup Tokyo #3 発表資料)
NTT DATA Technology & Innovation
PDF
Driverについて
幸雄 村上
PDF
Webフロントエンド開発の最新トレンド - HTML5, モバイル, オフライン
Shumpei Shiraishi
PPTX
Develop Web Application with Node.js + Express
Akinari Tsugo
PDF
Start SQL Server with Docker
Oshitari_kochi
Sendai.html5#2
Reoto Wakabayashi
Dev for Citizen Manual
テスト データ
中・大規模でLaravelを導入するTips
Kenjiro Kubota
MVCもやもや話
Tetsuya Kaneuchi
サーバーからiOSアプリを変更する
toyship
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
Fumiya Sakai
Angular js はまりどころ
Ayumi Goto
Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】
WESEEKWESEEK
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
Tomoki Oyamatsu
SwiftとCocoaPodsで始めるサクサクiOS開発!
Koji Shiraishi
ROS JAPAN Users Group Meetup 03
Daiki Maekawa
jQuery Mobile
yoshikawa_t
APIMeetup 20170329_ichimura
Tomohiro Ichimura
Progressive Framework Vue.js 2.0
Toshiro Shimizu
MTDDC Meetup HOKKAIDO 2013 KEYNOTE - Movable Type 6
Daiji Hirata
OpenLineage による Airflow のデータ来歴の収集と可視化(Airflow Meetup Tokyo #3 発表資料)
NTT DATA Technology & Innovation
Driverについて
幸雄 村上
Webフロントエンド開発の最新トレンド - HTML5, モバイル, オフライン
Shumpei Shiraishi
Develop Web Application with Node.js + Express
Akinari Tsugo
Start SQL Server with Docker
Oshitari_kochi
freee社でのReactiveCocoa活用例
1.
freee社での Reactive Cocoa
活用例 ReactiveCoaoa Tokyo #rac_tokyo @yo_waka 2014/10/18
2.
初めまして @yo_waka •
freeeという会計サービスのスタートアップで Web側とiOS/Androidアプリを作ってます • iOSアプリ開発歴(2014/01~) 以前*.frameworkを仕事で少し弄ってたくらい • JavaScriptはそこそこ
3.
freeeのiOSアプリ • 確定申告や小規模法人決算を
カンタンに • 既にWeb版がある • モバイルは基本機能を実装しつ つ、出先などでよりカンタン にデータ登録したり、外部機 器と連携したり
4.
ReactiveCocoa • 弊社アプリではコアライブラリとして使ってい
ます(新規開発だから使えたというのも理由) • RAC3とswiftの話しはしません! (@ikesyoさんがしてくれるはず・・) • freee社での導入の経緯とどう使っているかをご 紹介します
5.
アプリ開発談 • ある2013年12月の風景
• 「ユーザーの利便性向上の一環で、ウチでiPhone アプリを出そうと思う。1月から確定申告シーズ ンになって触ってくれる人も増えるので、来月出 したい」
6.
「来月出したい」 (゚Д゚)
7.
短期間リリース • -
エンジニア1人(アプリはほぼ未経験) 途中から1人エンジニアが参加して2人に • - 開発期間は1ヶ月
8.
でも • 短期間リリースだからといっても、出して終了ではない
ので、機能追加はしていかないといけない 最低限の機能でもちゃんと使いやすく作りたい • 会計サービスは結構UIが複雑 • スタートアップで後から設計変更してる余裕ない (いきなり大ヒット!とかだと話しは別かも) • なるべく長期間もちこたえられる設計を最初から模索す る必要がある
9.
変更に強い設計って なんだ
10.
サービスの特徴 • 会計データの入力時、ユーザーがViewの状態を
変化させることによって別のViewを変化、ある いは追加/削除するケースが多い => Viewの状態管理が複雑 • ユーザーが柔軟に会計用のデータセットを変え られるため、データの変更に応じてViewを再描 画するケースが多い => 複数のモデルを管理しないといけない
11.
(拡張)MVC Model UIViewController
Storyboard UIView 操作 イベント 呼び出し
12.
MVCの問題点 • シンプルな構造なら問題ない
• Fat UIViewController/Model • UIViewController+ViewsとModelは1:1とは限らないので、 ビジネスロジックが散らばる • APIどこのレイヤが叩くねん問題 • 画面内のイベントが増えると管理しずらい • Web版のクライアントMVCで上記の問題を抱えている
13.
MVVM ViewModel UIViewController
Story board UIView 呼び出し イベント Model 操作 イベント 呼び出し
14.
ViewModel • UIViewControllerの状態管理
• APIリクエストの発行 • Model(s)の操作
15.
と、いうわけで
16.
freeeアプリ構成 ViewModel UIViewController
Story board UIView RAC Model (Mantle) 操作 RAC API Client (AFNetworking) RAC
17.
MVVMの レイヤ間をRACで繋ぐ
18.
ReactiveCocoa • UIViewControllerとView間のイベント管理
• View間のデータバインディング • UIViewControllerとViewModel間のデータバインディング • ViewModelとAPIClient間のデータバインディング
19.
UIViewControllerとView間の イベント管理 YRLG
20.
VHWXS9LHZV ^ 8,1LE IL[HG1LE
8,1LEQLE:LWK1LE1DPH#6RPH1LE1DPHEXQGOHQLO@ VHOIIL[HG9LHZ IL[HG1LELQVWDQWLDWH:LWK2ZQHUVHOIRSWLRQVQLO@@ VHOIYLHZDGG6XEYLHZVHOIIL[HG9LHZ@ ! :($.,)VHOI
21.
! ࣇࣽऍࣕअࣶࣙऍࡨ༇ࡱࢨࡻࢥ࣭ࣿखࢮᦻࡴࢧ VHOIIL[HG9LHZFDQFHO%XWWRQUDFBFRPPDQG
5$RPPDQGDOORF@ LQLW:LWK6LJQDO%ORFNALGB
22.
^ 67521*,)6(/)
23.
6(/)FORVH)L[HG9LHZ@ UHWXUQ5$6LJQDOHPSW@ `@
` RACのカテゴリ拡張を 使って簡易に書ける
24.
View間のバインディング YRLG
25.
VHWXS ^ :($.,)VHOI
26.
! ࣠ࣇ࣓࣯ࢽखअࣣࢇࡨࡿࡻࢥ࣪ऄ࣡ख࣑ँऍ 5$6LJQDOFRPELQH/DWHVW#5$2EVHUYHVHOIWH[W
27.
VHOIUDFBWH[W6LJQDO@ UHGXFHALGLGRQHLGWZR
28.
^ UHWXUQQLO `@VXEVFULEH1H[WALG[
29.
^ 67521*,)6(/)
30.
6(/)YDOLGDWH@ `@ !
ัᩒ૯ࡳࡻ᧻ࢇ࣪ऄ࣡ख࣑ँऍ 5$2EVHUYHVHOIUHTXLUHG
31.
VXEVFULEH1H[WA161XPEHU HQDEOHG
32.
^ 67521*,)6(/)
33.
LIHQDEOHGERRO9DOXH
34.
^ 6(/)YDOLGDWH@ `
`@ ! (PDLO࣯ࢽखअࣣ૯ࡳࡻ᧻ࢇ࣪ऄ࣡ख࣑ँऍ 5$2EVHUYHVHOILV(PDLO)LHOG
35.
VXEVFULEH1H[WA161XPEHU HQDEOHG
36.
^ 67521*,)6(/)
37.
LIHQDEOHGERRO9DOXH
38.
^ 6(/)YDOLGDWH@ `
`@ RACObserveとTextSignalを まとめてsubscribe プロパティの変更を RACObserveで監視して subscribe
39.
UIViewControllerとViewModel間 のバインディング YRLG
40.
IHWFK2EMHFWV ^ 693URJUHVV+8'VKRZ:LWK6WDWXV16/RFDOL]HG6WULQJ#/2$',1*QLO
41.
PDVN7SH693URJUHVV+8'0DVN7SHOHDU@ ! :($.,)VHOI
42.
! 9LHZ0RGHOࡧࢥ$3,ࢮହࡠࢂ࣠खࣰअ࣭ࣿखࢮUHORDG
ࣂःखࢆࢥࣻࣝࣕख࣒ࢮᝊᐱ VHOIYLHZ0RGHOIHWFKROOHFWLRQ@VXEVFULEH1H[WALGREM
43.
^ 693URJUHVV+8'GLVPLVV@ !
67521*,)6(/)
44.
6(/)WDEOH9LHZUHORDG'DWD@ `HUURUA16(UURU HUURU
45.
^ 166WULQJ HUURU0HVVDJH HUURUXVHU,QIR#HUURUBPHVVDJHVBWRBGLVSOD@
693URJUHVV+8'VKRZ(UURU:LWK6WDWXVHUURU0HVVDJH@ `@ ` ViewModelは RACSignalを返す
46.
ViewModelとAPIClient間の バインディング 5$6LJQDO
47.
IHWFK:DOOHW7[QV ^ LIVHOIORDGLQJ
(6
48.
^ UHWXUQ5$6LJQDOHPSW@ `
VHOIORDGLQJ (6 ! APIClientはRACSignalを返す 5$6LJQDO VLJQDO $SLOLHQWVKDUHG,QVWDQFH@ VLJQDO:LWK5HTXHVW#*(7 APIコールの結果をsubscriber SDWK#$3,85/ SDUDPHWHUVSDUDPV@ ! で受け取る :($.,)VHOI
49.
! आ࣓ࣷऍ࣓ࢮࣼ࣡अࣉः࣓૯ࡳࢂ9LHZ0RGHOࢇ৶༧ UHWXUQVLJQDOGR1H[WA16'LFWLRQDU UHVSRQVH2EMHFW
50.
^ 67521*,)6(/)
51.
! IRU16'LFWLRQDU REMLQUHVSRQVH2EMHFW#PRGHOV@
52.
^ 16(UURU HUURU QLO
1LFH0RGHO PRGHO 07/-621$GDSWHUPRGHO2IODVV1LFH0RGHOFODVV@IURP-621'LFWLRQDUREM HUURU HUURU@ ! LIHUURU QLO
53.
^ 6(/)FROOHFWLRQDGG2EMHFWPRGHO@ `
` `@GR(UURUA16(UURU HUURU
54.
^ 67521*,)6(/)
55.
6(/)ORDGLQJ 12 `@
` doNextでコールバックを書 きつつRACSignalを返せる
56.
ViewModelとAPIClient間の バインディング
ࢼࣉ࣓ࣕखࣉऍࢮଯยࡳࢂ࠵ऀख࣐खవࢄધှᄚᓌࢇัឃࢆ࣡खࣙࢮଯยࡵࢧ࠶ 5$6LJQDO
57.
ORJLQ16'LFWLRQDU
58.
SDUDPV ^ :($.,)VHOI
59.
! 5$6LJQDO VLJQDO VHOIIHWFK7RNHQSDUDPV@IODWWHQ0DSALGUHVSRQVH2EMHFW
60.
^ 67521*,)6(/)
61.
5$6LJQDOࢮᣎࡵ$3,ऄࣉࣂ࣓ࢮग़દࢇᝁࡳ࠵ ᔬၯࢮ5$6LJQDOࢃରଯࢧ UHWXUQ6(/)JHW8VHU'DWD@FRPELQH/DWHVW:LWK6(/)IHWFK,URLUR@
UHIUHVKDFKH@@ `@ UHWXUQVLJQDO `
62.
なぜ ReactiveCocoa?
63.
勉強し始めの頃 • まずは認証/APIクライアントちゃんと書かない
となー • よい設計の参考になりそうなライブラリのコー ドをいろいろ読んでみた • GitHub社のoctkit.objcを読んだ
64.
octokit.objc • OctoKit
is a Cocoa and Cocoa Touch framework for interacting with the GitHub API, built using AFNetworking, Mantle, and ReactiveCocoa.
65.
ソースめっちゃ綺麗 これ参考にしよう
66.
RACのドキュメント見た • @ikesyoさんのQiitaに資料がまとまってる
http://qiita.com/ikesyo/items/ff0fdc179baa92a144ee • Functional Reactive Programming in iOS 多分唯一の?ReactiveCocoaとMVVMについて書かれている本 https://leanpub.com/iosfrp • RACSignalはどんなストリーム上にも作れることが分かった • API周りだけじゃなくて、コンポーネント間のデータのやり取りに使える んじゃね? • RACObserve使えばシンプルにデータバインディングできるし、Viewで も使えそう
67.
かくしてロックイン されました
68.
ロックインのPros/Cons • Pros
• MVVMの各コンポーネント間のコードが統一される (=新しく入った人の学習コスト減) • 1つSignal設計すると使い回しがしやすい • Signal設計楽しいれす • カテゴリ拡張(NSNotification#rac_addObserverForNameとかUITextField#rac_textSignal)がと にかく便利 • RACObserveサイコー • Cons • SubscriberやRACSignalのコードを理解するのが難しい・・ • 性質上既存のアプリに導入するのは大変(腕力を持ったエンジニアが必要) • RACが死ぬと我々も死ぬ
69.
RACの学習コスト • JVMの世界でもリアクティブプログラミングが
盛り上がってきてる(ReactiveStream) • AndroidでMVVMやる場合も同じ考え方で使い 回しが効くので便利(freeeではAndroidアプリ でもRxJavaを使ってMVVM構成にしています) • まずはRACObserveでKVOの置き換えから!
70.
ありがとうございました
71.
iOS/Androidについて語りたい人いたらいつでも 遊びにきてください。 !
夕飯出ます お酒もありますので 気軽に声かけてください
Download