NSURLConnection (非同期) [1]
NSURLConnectionを使ってURLからデータを非同期的に取得する方法です。 通信による処理によってアプリケーション全体をブロックさせないアプリケーションを書いたり、プログレスバーを作るには非同期的な手法を使うのが一般的です。
サンプルコード
URLを指定した非同期的なデータ取得サンプルを以下に示します。
以下のコードの特徴は、delegateされるためのオブジェクトを生成している点です。 以下のサンプルコードは、単に動作の概要を示すためのスケルトンコードであるため各メソッドでNSLogを出力しているだけです。 そのため、データを実際に取得していません。 手元で実行して、メソッドが呼び出されていく様子を見て頂ければ幸いです。
#import
// 通信の進捗具合に応じて呼び出される
@interface myUrlConnDelegate : NSObject
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
@end
@implementation myUrlConnDelegate
// レスポンスを受け取った時点で呼び出される。データ受信よりも前なので注意
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"didReceiveResponse");
}
// データを受け取る度に呼び出される
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"didReceiveData");
}
// データを全て受け取ると呼び出される
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"connectionDidFinishLoading");
}
@end
int main(int argc, char *argv[])
{
id pool = [[NSAutoreleasePool alloc] init];
NSLog(@"main");
NSURLRequest *req;
// URLやtimeoutIntervalを必要に応じて変更して下さい
req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.example.com/"]
cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
// 呼び出しを受け取るためのオブジェクトを生成
myUrlConnDelegate *del = [[myUrlConnDelegate alloc] init];
// myUrlConnDelegateへdelegateしながら初期化
NSURLConnection *conn;
conn = [[NSURLConnection alloc] initWithRequest:req delegate:del];
if (conn) {
NSLog(@"main : NSURLConnection create success");
} else {
NSLog(@"main : conn is nil");
return 1;
}
// 実際の動作はNSRunLoopで行われます
NSLog(@"main : Before NSRunLoop");
[[NSRunLoop currentRunLoop] run];
// このサンプルコードはここへ到達しません
[pool release];
}
なお、上記サンプルコードは不完全であり、通信中にエラーが発生すると不正終了します。