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」に記載されている。