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];
}


なお、上記サンプルコードは不完全であり、通信中にエラーが発生すると不正終了します。

IPv6基礎検定

YouTubeチャンネルやってます!