NSURLConnection を使って非同期に Web API を呼び出してみた

Objective-C で Web API を非同期に呼び出すのに使えるライブラリを探していて、ASIHttpRequest や AFNetworking あたりが使えそうだったけど、標準の NSURLConnection にも非同期メソッドがあったのでこちらを使ってみる。

練習に、GitHub のリポジトリ一覧を取得する API を呼び出すサンプルを書いてみた。

NSURL *url = [NSURL URLWithString:@"https://api.github.com/users/tnakamura/repos"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

// Web API を非同期に呼び出す
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    NSError *jsonError = nil;
    NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data
                                                         options:NSJSONReadingAllowFragments
                                                           error:&jsonError];

    // Repository クラスの配列に変換する
    NSMutableArray *repositories = [[NSMutableArray alloc] init];
    for (NSDictionary *dic in jsonArray)
    {
        Repository *repo = [[Repository alloc] init];
        repo.name = [dic objectForKey:@"name"];
        NSDictionary *owner = [dic objectForKey:@"owner"];
        repo.owner = [owner objectForKey:@"login"];
        [repositories addObject:repo];
    }

    // コールバックに取得したリポジトリを渡す
    completeHandler(repositories);
}];

Blocks の型が C/C++ の関数ポインタみたいで抵抗あるけど、Blocks のおかげで非同期呼び出しとコールバックを同じ場所に書けるので、デリゲートを渡す方法よりも断然マシ。