Use left/right arrow to change slides

Promise Starter Kit

PromiseKitについて

自己紹介

アイコン

Promises?

Promises A/+

Promiseライブラリ

Promise Syntax

NSURLConnectionの例

getURL

+ (PMKPromise *)getURL:(NSURL *) URL {
    return [PMKPromise new:^(PMKPromiseFulfiller fulfiller, PMKPromiseRejecter rejecter) {
        NSURLRequest *request = [NSURLRequest requestWithURL:URL];
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
            if (connectionError) {
                rejecter(connectionError);// 失敗
            }else {
                fulfiller(data);// 成功
            }
        }];
    }];
}

Promiseオブジェクト

PMKPromise *httpPromise = [HTTPPromise getURL:[NSURL URLWithString:@"http://example.com/get"]];
httpPromise.then(^(NSData *result) {
   NSDictionary *object = [NSJSONSerialization JSONObjectWithData:result options:0 error:nil];
   NSLog(@"%@", object)
}).catch(^(NSError *error) {
   NSLog(@"%@", [error localizedDescription]);
});

Promiseは値の器

Promiseの状態は3つだけ

promise-state

Promiseは使い捨てオブジェクト

Promiseは連鎖的に書ける

PMKPromise *promise = [PMKPromise promiseWithValue:@0];
promise.then(^{
   NSLog(@"Task A");
}).then(^{
   NSLog(@"Task B");
}).catch(^(NSError *error) {
   // A or B でエラーがある場合はここでキャッチされる
   NSLog(@"error = %@", error);
}).then(^{
   NSLog(@"Final Task");
});

Promiseチェインの図

flow

複数のリクエストを同時に?

PMKPromise *aPromise = [HTTPPromise getURL:[NSURL URLWithString:@"http://example.com/a"]];
PMKPromise *bPromise = [HTTPPromise getURL:[NSURL URLWithString:@"http://example.com/b"]];
PMKPromise *cPromise = [HTTPPromise getURL:[NSURL URLWithString:@"http://example.com/c"]];
// a,b,c 全てがresolveされた時にコールバックが実行される
[PMKPromise all:@[aPromise, bPromise, cPromise]].then(^(NSArray *results) {
   NSData *aResult = results[0];// aのレスポンス
   NSData *bResult = results[1];// bのレスポンス
   NSData *cResult = results[2];// cのレスポンス
}).catch(^(NSError *error) {
   NSLog(@"error = %@", error);
})

Promiseとエラーハンドリング

then は新しいオブジェクトを返す?

PMKPromise *promise = [PMKPromise promiseWithValue:@1];
PMKPromise *newPromise = promise.then(^{
    return @1;
});
XCTAssertNotEqualObjects(promise, newPromise);

Promiseとスレッド

完璧なPromiseはない

Promiseは万能ではない

ユースケース

まとめ

おわり

参考資料

その他

エラーハンドリング忘れると…

対策

azu

http://efcl.info/