通信ライブラリの定番になりつつあるAFNetworking。大変便利です。NSURLConnectionを使う機会はほとんどなくなりました。各クラスの使い方を説明していきたいと思います。

今回は、基本的なHTTP通信の方法、JSONの取得、画像の取得について説明します。

AFHTTPRequestOperationクラス

代表的なクラスは、AFHTTPRequestOperationです。このクラスを使って基本的なHTTP通信処理を行うことができます。

以下はhttp://www.yahoo.co.jp/へアクセスしてHTMLを文字列でNSLogに出力します。

NSURL *url = [NSURL URLWithString:@"http://www.yahoo.co.jp/"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"%@", operation.responseString);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", error.localizedDescription);
}];
[operation start];

AFNetworkingのHTTPリクエスト処理の主な特徴は、

  • NSOperationのSubclassを使う(今回はAFHTTPRequestOperation)
  • ブロック関数を使って成功と失敗を非同期で受け取る

です。

Successブロック関数でAFHTTPRequestOperation(operation)が引数に渡されます。ここからレスポンスの以下の情報にアクセスできます。

  • operation.responseString – レスポンスを文字列で得る
  • operation.responseStringEncoding – レスポンスが文字列だった時のエンコーディング
  • operation.responseData – レスポンスをNSDataで得る。バイナリデータはこちらを使う

POSTやDELETEでリクエストしたい時は、NSURLRequest#setHTTPMethodを使います。

NSURLRequest *request = [NSURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

AFHTTPRequestOperationはNSOperationのSubclassであるので、複数のリクエストをNSOperationQueueにキューイングすることができます。

_queue = [[NSOperationQueue alloc] init];
〜〜〜〜
[_queue addOperation:operation];

AFJSONRequestOperationクラス

よくあるのがAPIを叩いてJSONで取得するというパターン。この場合、AFHTTPRequestOperationを使うよりも、AFJSONRequestOperationを使ったほうが手軽です。JSONをパースする手間がありません。

NSURL *url = [NSURL URLWithString:〜何かのAPIのURL〜];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    // JSON変数はNSDictionaryかNSArrayにパース済み
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {

}];
[operation start];

AFImageRequestOperationクラス

サーバーから画像を取得したいこともよくあるでしょう。その場合はAFImageRequestOperationを使うと楽です。

NSURL *url = [NSURL URLWithString:〜画像のURL〜];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFImageRequestOperation *operation = 
    [AFImageRequestOperation imageRequestOperationWithRequest:request
                                                      success:^(UIImage *image) {
                                                            _imageView.image = image;
    }];
[operation start];

失敗した時を受け取りたい場合は、以下のようにします。

[AFImageRequestOperation imageRequestOperationWithRequest:request
    imageProcessingBlock:nil
     success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
         _imageView.image = image;
     } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
         _imageView.image = 読み込み失敗の画像など;
     }];

ちなみにUIImageView#imageに非同期でサーバーの画像を表示したい場合は、UIImageView+AFNetworkingのカテゴリメソッドsetImageWithURL:を使うと、もっと楽です。

[_imageView setImageWithURL:[NSURL URLWithString:〜画像のURL〜]];

AFXMLRequestOperationクラス

JSONが主流になって最近は機会が減りましたがサーバーのXMLを取得したい場合があります。その場合はAFXMLRequestOperationを使います。

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:〜XMLのURL〜]];
AFXMLRequestOperation *operation = [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
  XMLParser.delegate = self;
  [XMLParser parse];
} failure:nil];
[operation start];

次回は、AFHTTPClinetについて説明します。
その2へ続く。