ASIHTTPRequestを使って簡単非同期通信

CFNetwork APIのラッパーフレームワークであるASIHTTPRequestを使うと、iPhoneアプリの非同期通信が簡単に実現出来るので、その利用方法を以下にメモしておく。


[設定]
1. ASIHTTPRequestのホームページのリンク(Download the latest version)からASIHTTPRequestの最新ソースコードをダウンロードする
2. 必要なファイルをiPhoneアプリのプロジェクトにコピーする
 最低限必要なファイルはClassesフォルダ配下の12ファイル(ASIInputStream.h、ASIInputStream.m、ASIHTTPRequest.h、ASIHTTPRequest.m、ASINSStringAdditions.h、ASINSStringAdditions.m、ASIFormDataRequest.h、ASIFormDataRequest.m、ASINetworkQueue.h、ASINetworkQueue.m、ASIAuthenticationDialog.h、ASIAuthenticationDialog.m)とExternalフォルダ配下の2ファイル(Reachability.h、Reachability.m)
3. iPhoneアプリのプロジェクトにフレームワークCFNetwork、SystemConfigurationを追加する
 フレームワーク追加時には既追加済みフレームワーク(UIKit.framework等)と同じiPhone SDKバージョンの物を追加するように気をつける。
4. iPhoneアプリのプロジェクトに動的ライブラリlibz.1.2.3.dylibを追加する


注:記事を書いた当時と設定が若干変わっているようです。最新の設定方法は以下のサイトを参考にして下さい。


[使い方]
例えば特定のWebサイトの情報を取って来る場合は以下のようなコードになる。
これだけのコードで非同期にWebサイトの情報を取って来る事が出来る。

#import "ASIHTTPRequest.h"

- (void)grabURLInBackground {
    NSURL *url = [NSURL URLWithString:@"http://d.hatena.ne.jp/tomute/"];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setDelegate:self];
    [request startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request {
    NSString *responseString = [request responseString];
    NSLog(@"%@", responseString);
    // バイナリデータを取得したい場合は以下
    // NSData *responseData = [request responseData];
}

- (void)requestFailed:(ASIHTTPRequest *)request {
    NSError *error = [request error];
    NSLog(@"%@", [error localizedDescription]);
}


上記のrequestはグローバルなNSOperationQueueに格納され、同時に実行されるrequestの数は最大4という制限がある。また複数のrequestの進捗具合などを知りたい場合等、より複雑な処理を行う場合には、自分自身でNSOperationQueueを作成する方が良い。その場合には以下のようなコードとなる。

#import "ASIHTTPRequest.h"

- (void)grabURLInBackground {
    queue = [[NSOperationQueue alloc] init];
    NSURL *url = [NSURL URLWithString:@"http://d.hatena.ne.jp/tomute/"];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setDelegate:self];
    [request setDidFinishSelector:@selector(requestDone:)];
    [request setDidFailSelector:@selector(requestWentWrong:)];
    [queue addOperation:request];
}

- (void)requestDone:(ASIHTTPRequest *)request {
    NSString *response = [request responseString];
    NSLog(@"%@", response);
}

- (void)requestWentWrong:(ASIHTTPRequest *)request {
    NSError *error = [request error];
    NSLog(@"%@", [error localizedDescription]);
}

更に詳しい使い方に関しては「ASIHTTPRequest example code - All-Seeing Interactive」に記載されている。