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:
コンテンツ取得の流れ
コンテンツ取得の流れは次のようになります。
- メッセージ
initWithRequest:delegate:
を送信 (すぐにコンテンツ取得が開始) - メッセージ
connection:didReceiveResponse:
を受信 (応答の受信)
→ コンテンツのメタデータ (URL、MIME、コンテンツの長さなど) を得る
→ リダイレクトなどによってこのメッセージは1接続で複数発生する可能性があり、このときに、受信データのリセット (上記の例では[receivedData setLength:0]
など) を行う必要がある - メッセージ
connection:didReceiveData:
を受信 (データの受信)
→ 上記の例では[receivedData appendData:data]
など - メッセージ
connectionDidFinishLoading:
を受信 (接続の完了)
→ 接続は完了したのでコネクションの解放 (必要なら受信データの解放も) もしくは、
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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。