20
distinctUntilChanged の使いどころ 安宅正之 at ChatWork 株式会社 2014/10/18 (Sat)

distinctUntilChanged の使いどころ

  • Upload
    -

  • View
    865

  • Download
    4

Embed Size (px)

DESCRIPTION

ReactiveCocoa にある distinctUntilChanged の使い方の説明です。 ReactiveCocoa Tokyo (2014-10-18) LT 発表資料

Citation preview

Page 1: distinctUntilChanged の使いどころ

distinctUntilChangedの使いどころ安宅正之 at ChatWork 株式会社

2014/10/18 (Sat)

Page 2: distinctUntilChanged の使いどころ

自己紹介

• 安宅 正之 (あたか まさゆき / @at_aka)

• 2014/04 より ChatWork株式会社 モバイルチーム

• https://github.com/ataka

• Blog: clmemo@aka http://at-aka.blogspot.com

Page 3: distinctUntilChanged の使いどころ

状態管理フラグの 変更を知りたいなら

[RACObserve(self.viewModel, canFoo) distinctUntilChanged];

distinctUntilChanged が便利

Page 4: distinctUntilChanged の使いどころ

One-to-OneRAC(self.foo, enable) = RACObserve(self.viewModel, canFoo);

• View と ViewModel の property が一対一対応

Page 5: distinctUntilChanged の使いどころ

変換が必要な場合RAC(self.foo, title) = [RACObserve(self.viewModel, canFoo) map:^(NSNumber* enableNum) { BOOL enable = enableNum.boolValue; return (enable ? @“Foo” : @“Bar”); }];

• map で変換します

Page 6: distinctUntilChanged の使いどころ

subscribeNext も使えます

[RACObserve(self.viewModel, canFoo) subscribeNext:^(NSNumber* enableNum) { BOOL enable = enableNum.boolValue; self.foo = (enable ? @“Foo” : @“Bar”); }];

• property を代入できない場合も便利です[self.bar setTitle:@“Foo”];

• 循環参照が怖いです

Page 7: distinctUntilChanged の使いどころ

循環参照が怖いです

Page 8: distinctUntilChanged の使いどころ

rac_liftSelector[self rac_liftSelector:@selector(setFooTitle:) withSignals:RACObserve(self.viewModel, canFoo), nil]; !- (void)setFooTitle:(BOOL)enable { self.foo.title = (enable ? @“Foo” : @“Bar”); }

• weakSelf いらず。循環参照の恐怖から解放

• コードの可読性アップ!

Page 9: distinctUntilChanged の使いどころ

RACSignal* を外に出すRACSignal* canFooSignal = RACObserve(self.viewModel, canFoo); [self rac_liftSelector:@selector(setFooTitle:) withSignals:canFooSignal, nil]; !- (void)setFooTitle:(BOOL)enable { … }

• Signal が再利用可能になりました

Page 10: distinctUntilChanged の使いどころ

宣伝 ChatWork にはライブ機能

があります

Page 11: distinctUntilChanged の使いどころ

ChatWork Live プランビデオチャット 制限人数 音声チャット

フリー 2 人 YES

パーソナル 4 人 YES

ビジネス 14 人 YES

Page 12: distinctUntilChanged の使いどころ

仕様

• プランはライブ・ユーザーの中で最も高いプランが適用される

• 制限人数を越えると、音声チャットへ移行する

Page 13: distinctUntilChanged の使いどころ

カメラ ON/OFF フロント/バック・トグル

ビデオ・ビュー

Page 14: distinctUntilChanged の使いどころ

一つのシグナルで複数の処理RACSignal* canVideoChatSignal = RACObserve(self.viewModel, canVideoChat); [self.cameraOnButton // Camera ON/OFF rac_liftSelector:@selector(setEnabled:) withSignals:canVideoChatSignal, nil]; [self.cameraChangeButton // Front/Back Camera rac_liftSelector:@selector(setEnabled:) withSignals:canVideoChatSignal, nil]; [self rac_liftSelector:@selector(setVideo:) withSignals:canVideoChatSignal, nil]; !- (void)setVideo:(BOOL)canVideoChat { … }

Page 15: distinctUntilChanged の使いどころ

構成

PlanManagerModel

ServiceModel

LiveViewModelStoryboard LiveViewController

View ViewModel Model

ユーザー入室

ユーザーが入室しました

ユーザーのプランを確認 ビデオチャット可能かな?canVideoChat

viewModel.canVideoChat

ReactiveCocoa

ユーザー入室

ユーザーが入室しました

ユーザーが入室するたびに RACSignal が飛ぶ

Page 16: distinctUntilChanged の使いどころ

シグナルを 変更された時にだけ

受け取りたい

Page 17: distinctUntilChanged の使いどころ

それ distinctUntilChanged

で出来るよ

Page 18: distinctUntilChanged の使いどころ

修正版シグナルRACSignal* canVideoChatSignal = [RACObserve(self.viewModel, canVideoChat) distinctUntilChanged];

安全なシグナルができました

Page 19: distinctUntilChanged の使いどころ

まとめ

1. 処理が複雑になるなら rac_liftSelector を使う

2. 複数の処理に別れるなら RACSignal* を作る

3. シグナルの変更だけ知りたければ distinctUntilChanged を使う

Page 20: distinctUntilChanged の使いどころ

ご清聴 ありがとうございます