Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ReactiveCocoaのゆるい紹介とメルカリでの活用事例

 ReactiveCocoaのゆるい紹介とメルカリでの活用事例

Retty Tech Cafe第3回「スタートアップ×iOS開発」で発表した資料に加筆+修正をしたものです

https://atnd.org/events/67600

Shinichiro Oba

August 11, 2015
Tweet

More Decks by Shinichiro Oba

Other Decks in Programming

Transcript

  1. ReactiveCocoaとは "ReactiveCocoa  (RAC)  is  a  Cocoa   framework  inspired  by

     Functional   Reactive  Programming.  It  provides   APIs  for  composing  and  transforming   streams  of  values  over  time.”   https://github.com/ReactiveCocoa/ReactiveCocoa
  2. ストリームの加⼯工 ストリーム上のデータに対して  filter  した り  map  したり  merge  したり  zip

     したり   reduce  したりできる   オペレータと呼ばれる   ここが関数型、すなわちFunctional!
  3. すべてを使ったコードの例例 [[[self.textField rac_textSignal] filter:^BOOL(NSString *value) { return value.length > 0;

    }] subscribeNext:^(NSString *value) { NSLog(@“%@", value); }]; -‐‑‒rac_̲textSignal ⼊入⼒力力⽂文字列列からストリームを⽣生成 -‐‑‒filter: ストリームをfilterして空⽂文字列列が 含まれないように加⼯工 -‐‑‒subscribeNext: ストリームを購読してログ出⼒力力
  4. 読み込んだ記事 The  introduction  to  Reactive  Programming   you've  been  missing

      https://gist.github.com/staltz/868e7e9bc2a7b8c1f754   【翻訳】あなたが求めていたリアクティブプログラミ ング⼊入⾨門   http://ninjinkun.hatenablog.com/entry/introrxja
  5. RACを使っている画⾯面 住所編集画⾯面   住所⼀一覧画⾯面   銀⾏行行情報編集画⾯面   検索索条件選択画⾯面   通知設定画⾯面

      ⽀支払い⽅方法選択画⾯面   商品⼀一覧画⾯面   購⼊入画⾯面   検索索コーチマーク画⾯面   検索索サジェスト画⾯面
  6. Promiseの例例 購⼊入画⾯面   タイムアウトを設けた失敗してもよい⾮非同期処理理と 購⼊入APIの完了了を両⽅方待つ RACSignal *timeoutSignal = [[RACSignal merge:@[

    _btDataSignal, [RACSignal interval:kBTDataTimeout onScheduler:[RACScheduler mainThreadScheduler]], ]] take:1]; [RACSignal combineLatest:@[_buyAPISignal, timeoutSignal]] subscribeNext:^(RACTuple *tuple) { //... } error:^(NSError *error) { //... }];
  7. MVVMを導⼊入した画⾯面 住所編集画⾯面   住所⼀一覧画⾯面   銀⾏行行情報編集画⾯面   検索索条件選択画⾯面   通知設定画⾯面

      ⽀支払い⽅方法選択画⾯面   商品⼀一覧画⾯面   購⼊入画⾯面   検索索コーチマーク画⾯面   検索索サジェスト画⾯面
  8. 応⽤用例例:インクリメンタルサーチ 検索索サジェスト画⾯面   以下とほぼ同じ実装をしている   http://qiita.com/ikesyo/items/e699eefe1d0985158420 個⼈人的にFRPが本領領発揮するケースの1つだと思う [[[[[textField.rac_textSignal filter:^BOOL(NSString *text)

    { return text.length > 0; }] throttle:0.5] map:^(NSString *text) { return [[APIClient sharedClient] fetchSearchResultWithQuery:text]; }] switchToLatest] subscribeNext:^(id JSON) { NSLog(@"Search result: %@", JSON); }];
  9. 循環参照しやすい 便便利利マクロ@strongifyと@weakifyを駆使   「Implicit  retain  of  ʻ‘selfʼ’  within  blocks」をYesに  

    Instrumentsでメモリの利利⽤用状況をチェック   AllocateのMark  Generationが便便利利