Tasaki です。
今日調査して分かったことがありましたので、入門編6回目としてお送りします。
3回目と4回目でレスポンスについて触れましたが、このときにはヘッダの取得とコネクションの確立失敗に関しての話だけに留まっていました。というのも、レスポンスの中身( HTTP body )の取得の仕方が分からなかったためです。これがやっと解決しました。
connection:didReceiveResponse: メソッドはレスポンスヘッダの取得時に呼び出されるメソッドでしたが、この他にレスポンスの内容を取得したときに呼ばれるデリゲートメソッドがあります。それがこちらです。
- ( void ) connection:( NSURLConnection *) connection didReceiveData:( NSData *) data;
- ( void ) connectionDidFinishLoading:( NSURLConnection *) connection;
前者はレスポンスデータの一部または全てを引数として与え、後者は全てのデータを取得した場合に呼び出されるメソッドです。
データが単一のパケットに収まりきらない場合は connection:didReceiveData: メソッドは、部分データを逐次渡してきます。そのため、このメソッドは1度のリクエストに対し、複数回呼び出される可能性があります。
これを利用して、サーバ側でリクエストが正常に受理された場合は1を、そうでない場合には0を返すようにしていた場合、クライアントの iPhone アプリでは以下のように実装することで、受理されたかどうかを知ることができます。
- ( void ) connection:( NSURLConnection *) connection didReceiveData:( NSData *) data {
unsigned char value;
[ data getBytes: &value length: sizeof( value )];
if( value ) {
// 受理された
}
}
レスポンスデータの取得も、このように簡単に行うことができます。
ふたを開けてみれば、すごく単純な話だったのですが、デリゲートメソッドの名前をタイプミスしていたせいで、今日の今日まで全くやり方が分かりませんでした。
その中で、NSURLResponse に body を取得するメソッドがないか調べたりしていました。たったこれだけのために、CFNetwork フレームワークを使わなきゃいけないのか、と悩んだりもしました。
というわけで、今回の経験で得た教訓
「デリゲートメソッドの名前はコピペしとけ!」
- 関連記事
-
スポンサーサイト
trackbackURL:http://appteam.blog114.fc2.com/tb.php/72-74db02ab