NSURLとNSURLConnection (5/6)
作成:2011-02-24 09:23
更新:2011-02-24 09:23
更新:2011-02-24 09:23
■非同期通信とデリゲート
同期通信は割と簡単でした(あれでも簡単なんです……)。問題は、非同期通信です。非同期通信は、接続を開始しても、そのまま処理を続けてしまい、サーバーからのレスポンスを待ちません。そして、全部の処理が終わったら、必要に応じて対応する処理を呼び出してもらって処理を行わせるのです。
これは、NSURLConnectionにいくつか関連するメソッドがあるのですが、以下のものがもっとも一般的でしょう。
NSURLConnectionには、非同期通信のための仕組みが備わっています。そして、非同期通信を開始し、必要に応じて用意しておいたメソッドを呼び出し処理を行わせるような仕組みが出来上がっているのです。ということは、実際に非同期通信をするときには、その呼び出されるメソッドに処理を用意しておけばいいわけですね。
こういう場合、Objective-Cではいろいろなアプローチがあります。NSURLConnectionを継承したクラスを定義しメソッドをオーバーライドする、というアプローチも考えられるでしょう。が、NSURLConnectionでは、そうしたやり方はとっていません。「デリゲート」というやり方を使うことにしているのです。
あらかじめ、デリゲートクラスというのを用意しておきます。これは、特別なクラスではなくて、ごく一般的なNSObjectを継承したクラスでOKです。そして、そのクラス内に、非同期通信で呼び出されるメソッドを定義しておくのです。
こうして作成されたデリゲートクラスをデリゲート先に設定してNSURLConnectionの非同期通信を開始すると、NSURLConnectionは必要に応じて(自分自身のではなく)設定されたデリゲートクラスにあるメソッドを呼び出し、処理を行うようになります。
では、デリゲートクラスにはどのようなメソッドが必要なのでしょうか。下のリスト欄に最低限必要となるものをざっとまとめておきました。それぞれの役割を整理しておきましょう。
これは、NSURLConnectionにいくつか関連するメソッドがあるのですが、以下のものがもっとも一般的でしょう。
NSURLConnection* 変数 = [[NSURLConnection alloc]非同期通信では、NSURLRequestの他に「デリゲートクラス」と呼ばれるものが利用されます。デリゲートというのは「代理人」のことです。デリゲートクラスとは、つまり「代理で処理を担当してくれるクラス」のことです。
initWithRequest:《NSURLRequest》 delegate:デリゲートクラス];
NSURLConnectionには、非同期通信のための仕組みが備わっています。そして、非同期通信を開始し、必要に応じて用意しておいたメソッドを呼び出し処理を行わせるような仕組みが出来上がっているのです。ということは、実際に非同期通信をするときには、その呼び出されるメソッドに処理を用意しておけばいいわけですね。
こういう場合、Objective-Cではいろいろなアプローチがあります。NSURLConnectionを継承したクラスを定義しメソッドをオーバーライドする、というアプローチも考えられるでしょう。が、NSURLConnectionでは、そうしたやり方はとっていません。「デリゲート」というやり方を使うことにしているのです。
あらかじめ、デリゲートクラスというのを用意しておきます。これは、特別なクラスではなくて、ごく一般的なNSObjectを継承したクラスでOKです。そして、そのクラス内に、非同期通信で呼び出されるメソッドを定義しておくのです。
こうして作成されたデリゲートクラスをデリゲート先に設定してNSURLConnectionの非同期通信を開始すると、NSURLConnectionは必要に応じて(自分自身のではなく)設定されたデリゲートクラスにあるメソッドを呼び出し、処理を行うようになります。
では、デリゲートクラスにはどのようなメソッドが必要なのでしょうか。下のリスト欄に最低限必要となるものをざっとまとめておきました。それぞれの役割を整理しておきましょう。
- (void)connection:(NSURLConnection *)connection接続が成功し、レスポンスが返されてきたときに呼び出されます。
didReceiveResponse:(NSURLResponse *)response;
- (void)connection:(NSURLConnection *)connectionサーバーからデータが送られてきた際に呼び出されます。大きなデータになると分割してなんか以下に分けてデータが送られます。その度に、このメソッドが呼ばれることになります。
didReceiveData:(NSData *)data;
- (void)connectionDidFinishLoading:データの受信が完了したときに呼び出されます。ここで、通信終了時の処理をよういしておけばよいでしょう。
(NSURLConnection *)connection;
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※デリゲートクラスに定義すべきメソッド @interface クラス名 : NSObject { } - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; - (void)connectionDidFinishLoading: (NSURLConnection *)connection; @end
※関連コンテンツ
「初心者のためのObjective-Cプログラミング入門」に戻る