Location via proxy:
[ UP ]
[Report a bug]
[Manage cookies]
No cookies
No scripts
No ads
No referrer
Show this form
Submit Search
freee社でのReactiveCocoa活用例
•
23 likes
•
23,257 views
yo_waka
Follow
ReactiveCocoa Tokyoで発表した資料です。
Read less
Read more
1 of 33
Download now
Downloaded 17 times
More Related Content
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