15
Bolts-iOSちょっと駆使した 非同期処理の例 ReactiveCocoa Tokyo @freee株式会社

ReactiveCocoa Tokyo LT

Embed Size (px)

DESCRIPTION

2014/10/18(土)に五反田の株式会社freeeさんで行われた勉強会[「Reactive Cocoa Tokyo」](http://connpass.com/event/8680/)のLTで発表した内容です。 ※ 公開用に修正しています。

Citation preview

Page 1: ReactiveCocoa Tokyo LT

Bolts-iOSを”ちょっと”駆使した 非同期処理の例

ReactiveCocoa Tokyo @freee株式会社

Page 2: ReactiveCocoa Tokyo LT

RACの話はしないしする気もない。 いいね?

Page 3: ReactiveCocoa Tokyo LT

自己紹介• @huin

• blog.huin.me

• Work at : - VOYAGE GROUP- genesix, Inc.

• iOS歴3年くらい

Page 4: ReactiveCocoa Tokyo LT
Page 5: ReactiveCocoa Tokyo LT

What is Bolts ?

• Parse(Facebook?)製の非同期処理ライブラリ

• Promiseっぽい何か

(メソッド名などが違う程度)

• PromiseKitに比べると人気がない

Page 6: ReactiveCocoa Tokyo LT

// Objective-C

- (BFTask *) fetchAsync:(PFObject *)object {

BFTaskCompletionSource *task = [BFTaskCompletionSource taskCompletionSource];

[object fetchInBackgroundWithBlock:^(PFObject *object, NSError *error) {

if (!error) {

[task setResult:object];

} else {

[task setError:error];

}

}];

return task.task;

}

Page 7: ReactiveCocoa Tokyo LT

// Objective-C

- (void) doSomething {

BFTask *task = [self fetchAsync:self.object];

[task continueWithBlock:^id(BFTask *task) {

if (task.error) {

// handle error

}else{

// do post fetch task…

}

return task;

}];

}

Page 8: ReactiveCocoa Tokyo LT

所感• 非同期処理の代表といえばネットワーク処理

• BFTaskオブジェクトを返すことでblocksを引き回さなくても良くなるのでコードが綺麗になる

• でもそれでいいんだろうか?

Page 9: ReactiveCocoa Tokyo LT

ポケットIRでの例

http://goo.gl/zYSYpI

Page 10: ReactiveCocoa Tokyo LT

下からフェードイン

上へフェードアウト

データの読み込み

Page 11: ReactiveCocoa Tokyo LT

不可避なネットワーク処理の間、 アニメーションを駆使することで

ユーザーの待機ストレスを減らしたい.

例) ローディングインジケータとか

Page 12: ReactiveCocoa Tokyo LT

1.処理のリスト

1.ロゴの出現アニメーション

2.ユーザー登録(if required)

3.お気に入りの取得

4.ロゴの非表示アニメーション

5.次の画面への遷移

a. 実行順序

a. 2→3は非同期処理を順番に実行

b. 1とタスクaは並列に処理する(タスクb)

c. タスクaとbの遅い方をタスクbの完了とする

d. タスクbが完了したら 4を開始する

e. 4が完了したら5を実行

Page 13: ReactiveCocoa Tokyo LT

// タスク(1) : ロゴの表示アニメーション BFTask *welcomeTask = [self showAnimationTask]; ! // タスク(2) : ユーザー登録 BFTask *userTask = [[self saveUserTask] continueWithBlock:^id(BFTask *task) { if (task.error) { return task; } // タスク(3) お気に入りの取得. タスク(2)の後に実行される. return [self fetchFavoriteTask]; }]; ! // タスク(b) : タスク(1)とタスク(a)の2つを並列に処理する BFTask *tasks = [BFTask taskForCompletionOfAllTasks:@[welcomeTask, userTask]]; ! [[tasks continueWithSuccessBlock:^id(BFTask *task) { ! // タスク(4) : ロゴの非表示アニメーション. タスク(b)完了後に実行される. return [self hideAnimationTask]; }] continueWithBlock:^id(BFTask *task) { if (task.error) { [UIAlertView alertWithError:task.error]; }else{ // タスク(5) : 次の画面への遷移 [self segueToNextView]; } return task; }];

Page 14: ReactiveCocoa Tokyo LT

• ネットワーク処理だけに限らず使いドコロはあるかも.

• もっとアニメーション凝っても良いかも(例 : アニメーション表示のプログレスバーをどうすれば体感速度がアップするのかが判明

| GIGAZINE http://goo.gl/6EaJQe)

• ご利用は計画的に

(非同期処理すべてでBolts使うべき?)

• ※ Bolts-iOSである必要はないので好きなライブラリで書けばいいよ!!

Page 15: ReactiveCocoa Tokyo LT

http://voyagegroup.com/crew/recruit/career/sdk/

iOSエンジニア募集中!