Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
freee社での 
Reactive Cocoa 活用例 
ReactiveCoaoa Tokyo #rac_tokyo 
@yo_waka 2014/10/18
初めまして 
@yo_waka 
• freeeという会計サービスのスタートアップで 
Web側とiOS/Androidアプリを作ってます 
• iOSアプリ開発歴(2014/01~) 
以前*.frameworkを仕事で少し弄ってたくらい 
• JavaScriptはそこそこ
freeeのiOSアプリ 
• 確定申告や小規模法人決算を 
カンタンに 
• 既にWeb版がある 
• モバイルは基本機能を実装しつ 
つ、出先などでよりカンタン 
にデータ登録したり、外部機 
器と連携したり
ReactiveCocoa 
• 弊社アプリではコアライブラリとして使ってい 
ます(新規開発だから使えたというのも理由) 
• RAC3とswiftの話しはしません! 
(@ikesyoさんがしてくれるはず・・) 
• freee社での導入の経緯とどう使っているかをご 
紹介します
アプリ開発談 
• ある2013年12月の風景 
• 「ユーザーの利便性向上の一環で、ウチでiPhone 
アプリを出そうと思う。1月から確定申告シーズ 
ンになって触ってくれる人も増えるので、来月出 
したい」
「来月出したい」 
(゚Д゚)
短期間リリース 
• - エンジニア1人(アプリはほぼ未経験) 
途中から1人エンジニアが参加して2人に 
• - 開発期間は1ヶ月
でも 
• 短期間リリースだからといっても、出して終了ではない 
ので、機能追加はしていかないといけない 
最低限の機能でもちゃんと使いやすく作りたい 
• 会計サービスは結構UIが複雑 
• スタートアップで後から設計変更してる余裕ない 
(いきなり大ヒット!とかだと話しは別かも) 
• なるべく長期間もちこたえられる設計を最初から模索す 
る必要がある
変更に強い設計って 
なんだ
サービスの特徴 
• 会計データの入力時、ユーザーがViewの状態を 
変化させることによって別のViewを変化、ある 
いは追加/削除するケースが多い 
=> Viewの状態管理が複雑 
• ユーザーが柔軟に会計用のデータセットを変え 
られるため、データの変更に応じてViewを再描 
画するケースが多い 
=> 複数のモデルを管理しないといけない
(拡張)MVC 
Model 
UIViewController 
Storyboard 
UIView 
操作 
イベント 
呼び出し
MVCの問題点 
• シンプルな構造なら問題ない 
• Fat UIViewController/Model 
• UIViewController+ViewsとModelは1:1とは限らないので、 
ビジネスロジックが散らばる 
• APIどこのレイヤが叩くねん問題 
• 画面内のイベントが増えると管理しずらい 
• Web版のクライアントMVCで上記の問題を抱えている
MVVM 
ViewModel 
UIViewController 
Story 
board 
UIView 
呼び出し 
イベント 
Model 
操作 
イベント 
呼び出し
ViewModel 
• UIViewControllerの状態管理 
• APIリクエストの発行 
• Model(s)の操作
と、いうわけで
freeeアプリ構成 
ViewModel 
UIViewController 
Story 
board 
UIView 
RAC 
Model 
(Mantle) 
操作 
RAC 
API Client 
(AFNetworking) 
RAC
MVVMの 
レイヤ間をRACで繋ぐ
ReactiveCocoa 
• UIViewControllerとView間のイベント管理 
• View間のデータバインディング 
• UIViewControllerとViewModel間のデータバインディング 
• ViewModelとAPIClient間のデータバインディング
UIViewControllerとView間の 
イベント管理 
YRLG
VHWXS9LHZV 
^ 
8,1LE
IL[HG1LE 8,1LEQLE:LWK1LE1DPH#׊6RPH1LE1DPHEXQGOHQLO@ 
VHOIIL[HG9LHZ IL[HG1LELQVWDQWLDWH:LWK2ZQHUVHOIRSWLRQVQLO@@ 
VHOIYLHZDGG6XEYLHZVHOIIL[HG9LHZ@ 
! 
:($.,)VHOI
! 


ࣇࣽऍࣕअࣶࣙऍࡨ༇ࡱࢨࡻࢥ࣭ࣿखࢮᦻࡴࢧ
 
VHOIIL[HG9LHZFDQFHO%XWWRQUDFBFRPPDQG 5$RPPDQGDOORF@ 
LQLW:LWK6LJQDO%ORFNALGB
^ 
67521*,)6(/)
6(/)FORVH)L[HG9LHZ@ 
UHWXUQ5$6LJQDOHPSW@ 
`@ 
` 
RACのカテゴリ拡張を 
使って簡易に書ける
View間のバインディング 
YRLG
VHWXS 
^ 
:($.,)VHOI
! 


࣠ࣇ࣓࣢࣯ࢽखअࣣࢇ਑ࡨ੠ࡿࡻࢥ࣪ऄ࣡ख࣑ँऍ
 
5$6LJQDOFRPELQH/DWHVW#5$2EVHUYHVHOIWH[W
VHOIUDFBWH[W6LJQDO@ 
UHGXFHALGLGRQHLGWZR
^ 
UHWXUQQLO 
`@VXEVFULEH1H[WALG[
^ 
67521*,)6(/)
6(/)YDOLGDWH@ 
`@ 
! 


ัᩒ૯ࡳࡻ᧻ࢇ࣪ऄ࣡ख࣑ँऍ
 
5$2EVHUYHVHOIUHTXLUHG
VXEVFULEH1H[WA161XPEHU
HQDEOHG
^ 
67521*,)6(/)
LIHQDEOHGERRO9DOXH

More Related Content

freee社でのReactiveCocoa活用例