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 のおかげで非同期呼び出しとコールバックを同じ場所に書けるので、デリゲートを渡す方法よりも断然マシ。