Tomute’s Notes Twitter

2009-10-09

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


MuneOchiMuneOchi 2010/06/15 13:12 ASIHTTPRequestのdocumentが更新されてますよ〜 http://allseeing-i.com/ASIHTTPRequest/Setup-instructions

tomutetomute 2010/06/16 10:33 > MuneOchiさん
あ、ホントですね!情報ありがとうございま〜す!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証