2010/11/09

NSURLConnectionを用いたURLローディングシステムによる通信

Objective-CではURLをベースとした通信フレームワークであるURLローディングシステムが用意されています。これはプロトコルとしてftp, http, https, fileをサポートしており、これらのプロトコルでの通信を行うアプリケーションを簡単に書くことができます。

この記事ではAppleの「URL Loading System Programming Guide」を参考にして、URLローディングシステムを利用した通信の概要について紹介します。NSURLConnectionは同期通信にも対応していますが本記事では触れません。また、iOSでは使用できないNSURLDownloadも基本的には取り扱いません。

要求の送信

要求を送信するまでのコードは次のようになります。

// 受け取ったデータを貯める (受け取るデータはNSDataなので)
 receivedData = [[NSMutableData data] retain];

 NSURLRequest* theRequest = [NSURLRequest
     requestWithURL:[NSURL URLWithString:@"http://www.apple.com/"]
     cachePolicy:NSURLRequestUseProtocolCachePolicy
     timeoutInterval:60.0];

 NSURLConnection* theConnection = [[NSURLConnection alloc]
      initWithRequest:theRequest
      delegate:self];

 if ( ! theConnection) {
   // エラー処理
 }

そして、delegateでは最低限の実装として、次の4つのメソッドを実装しておきます。

  • connection:didReceiveResponse:
  • connection:didReceiveData:
  • connection:didFailWithError:
  • connectionDidFinishLoading:

コンテンツ取得の流れ

コンテンツ取得の流れは次のようになります。

  1. メッセージ initWithRequest:delegate: を送信 (すぐにコンテンツ取得が開始)
  2. メッセージ connection:didReceiveResponse: を受信 (応答の受信)
    → コンテンツのメタデータ (URL、MIME、コンテンツの長さなど) を得る
    → リダイレクトなどによってこのメッセージは1接続で複数発生する可能性があり、このときに、受信データのリセット (上記の例では[receivedData setLength:0]など) を行う必要がある
  3. メッセージ connection:didReceiveData: を受信 (データの受信)
    → 上記の例では[receivedData appendData:data]など
  4. メッセージ connectionDidFinishLoading:を受信 (接続の完了)
    → 接続は完了したのでコネクションの解放 (必要なら受信データの解放も)
  5. もしくは、connection:didFailWithError: を受信 (接続の失敗)

  • メッセージ initWithRequest:delegate: を送信後から、connectionDidFinishLoading:connection:didFailWithError: を受けとるまでの間、メッセージcancelによって要求キャンセルが可能

  • 上記の紹介した以外のデリゲートメッセージには次のようなものがある
    • アップロード時の進捗 connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:
    • リダイレクト制御 connection:willSendRequest:redirectResponse:
    • 応答のキャッシュ制御 connection:willCacheResponse:

URLローディングに関連するクラス

URLローディングシステムのクラスは次の5つのカテゴリに分けられます。

  • URLローディング
  • キャッシュマネジメント
  • 認証と資格
  • クッキーストレージ
  • プロトコルサポート

ここでは、最初のカテゴリであるURLローディングに関連するクラス群について説明します。

NSURLRequest, NSMutableURLRequest

  • 接続タイムアウトのインタフェースを提供
  • ローカルキャッシュデータの使用を考慮したポリシーの指定
  • NSMutableURLRequestは作成後に変更可能
    → 基本的に接続時にディープコピーされる

NSURLConnection, NSURLDownload

  • どちらのクラスも認証やリダイレクト用のデリゲートを持つ
  • NSURLConnectionはデリゲートベースの実装 (要求ごとに応答のキャッシュ制御が可能)
  • NSURLDownloadは要求したコンテンツをディスクへ保存 (キャッシュ制御不可)

NSURLResponse, NSHTTPURLResponse

  • コンテンツのメタデータ (URL、MIME、コンテンツの長さなど) を管理
  • NSURLResponseはコンテンツ自体を含まない

まとめ

URLローディングシステムを利用した通信の概要について紹介しました

関連記事

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。