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.

freee社でのReactiveCocoa活用例

12,752 views

Published on

ReactiveCocoa Tokyoで発表した資料です。

Published in: Technology
  • Be the first to comment

freee社でのReactiveCocoa活用例

  1. 1. freee社での Reactive Cocoa 活用例 ReactiveCoaoa Tokyo #rac_tokyo @yo_waka 2014/10/18
  2. 2. 初めまして @yo_waka • freeeという会計サービスのスタートアップで Web側とiOS/Androidアプリを作ってます • iOSアプリ開発歴(2014/01~) 以前*.frameworkを仕事で少し弄ってたくらい • JavaScriptはそこそこ
  3. 3. freeeのiOSアプリ • 確定申告や小規模法人決算を カンタンに • 既にWeb版がある • モバイルは基本機能を実装しつ つ、出先などでよりカンタン にデータ登録したり、外部機 器と連携したり
  4. 4. ReactiveCocoa • 弊社アプリではコアライブラリとして使ってい ます(新規開発だから使えたというのも理由) • RAC3とswiftの話しはしません! (@ikesyoさんがしてくれるはず・・) • freee社での導入の経緯とどう使っているかをご 紹介します
  5. 5. アプリ開発談 • ある2013年12月の風景 • 「ユーザーの利便性向上の一環で、ウチでiPhone アプリを出そうと思う。1月から確定申告シーズ ンになって触ってくれる人も増えるので、来月出 したい」
  6. 6. 「来月出したい」 (゚Д゚)
  7. 7. 短期間リリース • - エンジニア1人(アプリはほぼ未経験) 途中から1人エンジニアが参加して2人に • - 開発期間は1ヶ月
  8. 8. でも • 短期間リリースだからといっても、出して終了ではない ので、機能追加はしていかないといけない 最低限の機能でもちゃんと使いやすく作りたい • 会計サービスは結構UIが複雑 • スタートアップで後から設計変更してる余裕ない (いきなり大ヒット!とかだと話しは別かも) • なるべく長期間もちこたえられる設計を最初から模索す る必要がある
  9. 9. 変更に強い設計って なんだ
  10. 10. サービスの特徴 • 会計データの入力時、ユーザーがViewの状態を 変化させることによって別のViewを変化、ある いは追加/削除するケースが多い => Viewの状態管理が複雑 • ユーザーが柔軟に会計用のデータセットを変え られるため、データの変更に応じてViewを再描 画するケースが多い => 複数のモデルを管理しないといけない
  11. 11. (拡張)MVC Model UIViewController Storyboard UIView 操作 イベント 呼び出し
  12. 12. MVCの問題点 • シンプルな構造なら問題ない • Fat UIViewController/Model • UIViewController+ViewsとModelは1:1とは限らないので、 ビジネスロジックが散らばる • APIどこのレイヤが叩くねん問題 • 画面内のイベントが増えると管理しずらい • Web版のクライアントMVCで上記の問題を抱えている
  13. 13. MVVM ViewModel UIViewController Story board UIView 呼び出し イベント Model 操作 イベント 呼び出し
  14. 14. ViewModel • UIViewControllerの状態管理 • APIリクエストの発行 • Model(s)の操作
  15. 15. と、いうわけで
  16. 16. freeeアプリ構成 ViewModel UIViewController Story board UIView RAC Model (Mantle) 操作 RAC API Client (AFNetworking) RAC
  17. 17. MVVMの レイヤ間をRACで繋ぐ
  18. 18. ReactiveCocoa • UIViewControllerとView間のイベント管理 • View間のデータバインディング • UIViewControllerとViewModel間のデータバインディング • ViewModelとAPIClient間のデータバインディング
  19. 19. UIViewControllerとView間の イベント管理 YRLG
  20. 20. VHWXS9LHZV ^ 8,1LE IL[HG1LE 8,1LEQLE:LWK1LE1DPH#׊6RPH1LE1DPHEXQGOHQLO@ VHOIIL[HG9LHZ IL[HG1LELQVWDQWLDWH:LWK2ZQHUVHOIRSWLRQVQLO@@ VHOIYLHZDGG6XEYLHZVHOIIL[HG9LHZ@ ! :($.,)VHOI
  21. 21. ! ࣇࣽऍࣕअࣶࣙऍࡨ༇ࡱࢨࡻࢥ࣭ࣿखࢮᦻࡴࢧ VHOIIL[HG9LHZFDQFHO%XWWRQUDFBFRPPDQG 5$RPPDQGDOORF@ LQLW:LWK6LJQDO%ORFNALGB
  22. 22. ^ 67521*,)6(/)
  23. 23. 6(/)FORVH)L[HG9LHZ@ UHWXUQ5$6LJQDOHPSW@ `@ ` RACのカテゴリ拡張を 使って簡易に書ける
  24. 24. View間のバインディング YRLG
  25. 25. VHWXS ^ :($.,)VHOI
  26. 26. ! ࣠ࣇ࣓࣢࣯ࢽखअࣣࢇ਑ࡨ੠ࡿࡻࢥ࣪ऄ࣡ख࣑ँऍ 5$6LJQDOFRPELQH/DWHVW#5$2EVHUYHVHOIWH[W
  27. 27. VHOIUDFBWH[W6LJQDO@ UHGXFHALGLGRQHLGWZR
  28. 28. ^ UHWXUQQLO `@VXEVFULEH1H[WALG[
  29. 29. ^ 67521*,)6(/)
  30. 30. 6(/)YDOLGDWH@ `@ ! ัᩒ૯ࡳࡻ᧻ࢇ࣪ऄ࣡ख࣑ँऍ 5$2EVHUYHVHOIUHTXLUHG
  31. 31. VXEVFULEH1H[WA161XPEHU HQDEOHG
  32. 32. ^ 67521*,)6(/)
  33. 33. LIHQDEOHGERRO9DOXH
  34. 34. ^ 6(/)YDOLGDWH@ ` `@ ! (PDLO࣯ࢽखअࣣ૯ࡳࡻ᧻ࢇ࣪ऄ࣡ख࣑ँऍ 5$2EVHUYHVHOILV(PDLO)LHOG
  35. 35. VXEVFULEH1H[WA161XPEHU HQDEOHG
  36. 36. ^ 67521*,)6(/)
  37. 37. LIHQDEOHGERRO9DOXH
  38. 38. ^ 6(/)YDOLGDWH@ ` `@ RACObserveとTextSignalを まとめてsubscribe プロパティの変更を RACObserveで監視して subscribe
  39. 39. UIViewControllerとViewModel間 のバインディング YRLG
  40. 40. IHWFK2EMHFWV ^ 693URJUHVV+8'VKRZ:LWK6WDWXV16/RFDOL]HG6WULQJ#/2$',1*QLO
  41. 41. PDVN7SH693URJUHVV+8'0DVN7SHOHDU@ ! :($.,)VHOI
  42. 42. ! 9LHZ0RGHOࡧࢥ$3,ࢮହࡠࢂ࣠खࣰअ࣭ࣿखࢮUHORDG ࣂःखࢆࢥࣻࣝࣕख࣒ࢮᝊᐱ VHOIYLHZ0RGHOIHWFKROOHFWLRQ@VXEVFULEH1H[WALGREM
  43. 43. ^ 693URJUHVV+8'GLVPLVV@ ! 67521*,)6(/)
  44. 44. 6(/)WDEOH9LHZUHORDG'DWD@ `HUURUA16(UURU HUURU
  45. 45. ^ 166WULQJ HUURU0HVVDJH HUURUXVHU,QIR#HUURUBPHVVDJHVBWRBGLVSOD@ 693URJUHVV+8'VKRZ(UURU:LWK6WDWXVHUURU0HVVDJH@ `@ ` ViewModelは RACSignalを返す
  46. 46. ViewModelとAPIClient間の バインディング 5$6LJQDO
  47. 47. IHWFK:DOOHW7[QV ^ LIVHOIORDGLQJ (6
  48. 48. ^ UHWXUQ5$6LJQDOHPSW@ ` VHOIORDGLQJ (6 ! APIClientはRACSignalを返す 5$6LJQDO VLJQDO $SLOLHQWVKDUHG,QVWDQFH@ VLJQDO:LWK5HTXHVW#*(7 APIコールの結果をsubscriber SDWK#׊$3,85/׋ SDUDPHWHUVSDUDPV@ ! で受け取る :($.,)VHOI
  49. 49. ! आ࣓ࣷऍ࣓ࢮࣼ࣡अࣉः࣓૯ࡳࢂ9LHZ0RGHOࢇ৶༧ UHWXUQVLJQDOGR1H[WA16'LFWLRQDU UHVSRQVH2EMHFW
  50. 50. ^ 67521*,)6(/)
  51. 51. ! IRU16'LFWLRQDU REMLQUHVSRQVH2EMHFW#PRGHOV@
  52. 52. ^ 16(UURU HUURU QLO 1LFH0RGHO PRGHO 07/-621$GDSWHUPRGHO2IODVV1LFH0RGHOFODVV@IURP-621'LFWLRQDUREM HUURU HUURU@ ! LIHUURU QLO
  53. 53. ^ 6(/)FROOHFWLRQDGG2EMHFWPRGHO@ ` ` `@GR(UURUA16(UURU HUURU
  54. 54. ^ 67521*,)6(/)
  55. 55. 6(/)ORDGLQJ 12 `@ ` doNextでコールバックを書 きつつRACSignalを返せる
  56. 56. ViewModelとAPIClient間の バインディング ࢼࣉ࣓ࣕ࣢खࣉऍࢮଯยࡳࢂ࠵ऀख࣐ख๻వࢄધှᄚᓌࢇัឃࢆ࣡खࣙࢮଯยࡵࢧ࠶ 5$6LJQDO
  57. 57. ORJLQ16'LFWLRQDU
  58. 58. SDUDPV ^ :($.,)VHOI
  59. 59. ! 5$6LJQDO VLJQDO VHOIIHWFK7RNHQSDUDPV@IODWWHQ0DSALGUHVSRQVH2EMHFW
  60. 60. ^ 67521*,)6(/)
  61. 61. 5$6LJQDOࢮᣎࡵ$3,ऄࣉࣂ࣓࣢ࢮग़દࢇ೷ᝁࡳ࠵ ᔬၯࢮ5$6LJQDOࢃର࡭ଯࢧ UHWXUQ6(/)JHW8VHU'DWD@FRPELQH/DWHVW:LWK6(/)IHWFK,URLUR@ UHIUHVKDFKH@@ `@ UHWXUQVLJQDO `
  62. 62. なぜ ReactiveCocoa?
  63. 63. 勉強し始めの頃 • まずは認証/APIクライアントちゃんと書かない となー • よい設計の参考になりそうなライブラリのコー ドをいろいろ読んでみた • GitHub社のoctkit.objcを読んだ
  64. 64. octokit.objc • OctoKit is a Cocoa and Cocoa Touch framework for interacting with the GitHub API, built using AFNetworking, Mantle, and ReactiveCocoa.
  65. 65. ソースめっちゃ綺麗 これ参考にしよう
  66. 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. 67. かくしてロックイン されました
  68. 68. ロックインのPros/Cons • Pros • MVVMの各コンポーネント間のコードが統一される (=新しく入った人の学習コスト減) • 1つSignal設計すると使い回しがしやすい • Signal設計楽しいれす • カテゴリ拡張(NSNotification#rac_addObserverForNameとかUITextField#rac_textSignal)がと にかく便利 • RACObserveサイコー • Cons • SubscriberやRACSignalのコードを理解するのが難しい・・ • 性質上既存のアプリに導入するのは大変(腕力を持ったエンジニアが必要) • RACが死ぬと我々も死ぬ
  69. 69. RACの学習コスト • JVMの世界でもリアクティブプログラミングが 盛り上がってきてる(ReactiveStream) • AndroidでMVVMやる場合も同じ考え方で使い 回しが効くので便利(freeeではAndroidアプリ でもRxJavaを使ってMVVM構成にしています) • まずはRACObserveでKVOの置き換えから!
  70. 70. ありがとうございました
  71. 71. iOS/Androidについて語りたい人いたらいつでも 遊びにきてください。 ! 夕飯出ます お酒もありますので 気軽に声かけてください

×