Tasaki です。
昨日は、製品アップデートのお知らせでしたので、間が空いてしまいましたが今回はネットワークプログラミング入門編の続きです。
前回、レスポンスの取得法について触れましたが、今回は実際のコード例をご紹介します。
例えばHTTPレスポンスから、特定のヘッダ情報を読み取る場合はこのように記述します。
- ( void ) connection:( NSURLConnection *) connection didReceiveResponse:( NSURLResponse *) response {
if([ response isKindOfClass:[ NSHTTPResponse class ]]) {
NSHTTPURLResponse *httpResponse = ( NSHTTPURLResponse *) response;
NSString *headerValue = [[ httpResponse allHeaderFields ] stringForKey: @"AnyValue" ];
if([ headerValue isEqualToString: @"1" ]) {
// 成功時の処理
} else {
// 失敗時の処理
}
}
[ connection release ];
}
このコードについて解説しますと、まず response が NSHTTPURLResponse オブジェクトかどうかを調べています。HTTPリクエストを送っていれば、HTTP レスポンスが渡されているはずです。
それから、レスポンスのヘッダ情報の中から AnyValue という特定のヘッダ情報の値を取得しています。この場合、サーバ側では処理に成功すると1を、失敗すると0を書き込むと想定していますので、クライアント側ではその値によって処理を分岐するようにしています。
最後に connection をリリースしていますが、これはコネクションの作成時に init... を使用していた場合に必要な措置です。今回は、レスポンスまでしか必要でなかったので、ここでリリースしちゃってますが、本来なら送受信の最後に呼びだされるデリゲートメソッドでこの解放処理をすべきでしょう。また、コネクション失敗時のデリゲートメソッドでも同様の処理を実装する必要があります。
Tasaki です。
今回はレスポンスの取得についてのお話です。
iPhone プログラミングでは、イベントのハンドルにデリゲートを使用することが一般的ですが、レスポンスの取得もこの方法で行います。
前回紹介したコネクションの作成時にデリゲートオブジェクトを指定しましたので、後はレスポンス受信時のデリゲートメソッドを実装すればよいことになります。
実装すべきメソッドはこれです。
- ( void ) connection:( NSURLConnection *) connection didReceiveResponse:( NSURLResponse *) response;
connection は通信に使用しているコネクションを、response は、サーバからのレスポンスを表すオブジェクトです。
なお、このメソッドは正常にリクエストが送信されレスポンスを取得した場合に呼び出されるものですので、これ以外に通信に失敗した場合のデリゲートメソッドも実装しておく必要があります。
そのためのメソッドがこちらです。
- ( void ) connection:( NSURLConnection *) connection didFailWithError:( NSError *) error;
このメソッドの引数に関しては、説明は不要かと思いますので省略します。
以上2つのメソッドを実装することで、レスポンスが返されたか、エラーが発生したかが分かります。
というところで、具体的な実装例は次回に回したいと思います。
Tasaki です。
ネットワークプログラミング入門編の2回目は、リクエストとコネクションの作成法について解説します。
前回、リクエストとコネクションそれぞれに対応するクラス NSURLRequest、NSURLConnection をご紹介しましたが、これを適切に初期化してやるだけで HTTP リクエストをサーバに送信することができます。
まずはリクエストからですが、初期化には以下のメソッドを使用します。
- ( id ) initWithURL:( NSURL *) url cachePolicy:( NSURLRequestCachePolicy ) cachePolicy timeoutInterval:( NSTimeInterval ) timeoutInterval;
+ ( id ) requestWithURL:( NSURL *) url cachePolicy:( NSURLRequestCachePolicy ) cachePolicy timeoutInterval:( NSTimeInterval ) timeoutInterval;
url には、URL オブジェクトを渡します。詳細は後述します。cachePolicy はURLリクエストのキャッシュデータの読み込みに関するランタイムの動作を指定します。例えばキャッシュデータを使用しない場合には、NSURLRequestReloadIgnoringLocalCacheData (長過ぎ)を指定します。timeoutInterval には、リクエストを時間切れとみなすまでの待ち時間(秒数)を指定します。
URL オブジェクトについてですが、これは URL を保持するためのオブジェクトで、以下のように URL を文字列として渡して初期化します。
+ ( id ) URLWithString:( NSString *) URLString;
- ( id ) initWithString:( NSString *) URLString;
このオブジェクトは、与えられた URL のホスト名やクエリをその部分だけ取得することができる便利なオブジェクトではありますが、今回のように直接 URL の全文を与える場合には、かえって回りくどいコードになってしまいます。
次にコネクションのイニシャライザを以下に示します。
+ ( NSURLConnection *) connectionWithRequest:( NSURLRequest *) request delegate:( id ) delegate;
- ( id ) initWithRequest:( NSURLRequest *) request delegate:( id ) delegate;
request には、予め作成しておいたリクエストを delegate には、レスポンスやデータがサーバから渡されたときに対処するデリゲートオブジェクトを指定します。
なお、サーバとの通信には、同期通信と非同期通信の2通りがありますが、今回ご紹介したのは非同期通信を行う場合のものです。
この返り値として、有効なコネクションオブジェクトが返されると、サーバに対してリクエストの送信が行われます。
これを踏まえて、簡単なリクエスト送信の流れを以下に示します。
- ( BOOL ) requestToServer:( NSString *) urlString {
NSURLRequest *request = [ NSURLRequest requestWithURL:[ NSURL URLwithString: urlString ] cachePolicy: NSURLRequestReloadIgnoringLocalCacheData timeoutInterval: 60.0 ];
if( request == nil ) {
return NO;
}
NSURLConnection *connection = [ NSURLConnection connectionWithRequest: request delegate: self ];
return ( connection != nil );
}
次回はレスポンスの取得についてですが、デリゲートプログラミングに馴染んでいれば、解説の必要はないかもしれません。
Tasaki です。
今回はネットワークプログラミングに関するテーマを取り上げます。と言うのも、Mac や iPhone のプログラミング関連の書籍や Web サイトはいくつもありますけど、ネットワークプログラミングの初心者に向けた解説ってほとんど見受けられなかったからです。(英文ならあるのかもしれませんが)
まずはじめに、iPhone では大まかに言うとネットワークに対して以下の三種類のアプローチが可能です。
・NSURLConnection 等の Objective-C で書かれた API を使用する方法
・CFNetwork フレームワークを利用する方法
・BSD ソケットを自分で生成するなど1からやる方法
後に挙げた項目ほど初心者には敷居が高く、たくさんのコードを記述する必要があります。その分、自由度は高まる訳ですが。
公式ドキュメントでは、2番目に挙げた CFNetwork を勧めていますが、ドキュメントが分かりにくく、それなりの量のコードも書かなければいけなさそうな雰囲気です。
ということで、1番簡単と思われる NSURLConnection 等を使用した HTTP 通信について解説していこうと思います。
なお、ここでは iPhone アプリをクライアントサイドとして話を進めます。
またサーバサイド(サーブレット)については詳しく触れません。
それでは、実際にコーディングに入る前に、今回使用するオブジェクトたちをご紹介します。
クラス名 | 説明 |
NSURLConnection | サーバとの通信を管理するオブジェクトです。これがないと始まりません。 |
NSURLRequest | HTTP リクエストを表すオブジェクトです。URL を初期化時に渡します。 |
NSHTTPURLResponse ( NSURLResponse ) | HTTP レスポンスを表すオブジェクトです。サーバから渡されます。 |
考え方としては、リクエストをコネクションに渡してサーバと通信してもらい、レスポンスが返されたらそれを受け取る、と言った具合です。
次回はリクエストとコネクションの作成について具体的に見ていきます。
Tasaki です。
前回お話ししたように、これから数回にかけて CoreData フレームワークの簡単な使い方をご紹介したいと思います。
まず初めに、CoreData フレームワークを使うことで何ができるのか、という点についてですが、プログラム内部のデータと同じような操作でデータベースとやり取りができます。
要は、SQL文をコードに書き込まずに済むようになります。
他にも利点はあるみたいですけど、ひとまずこの点に着目して、SQL文を書かずにデータベースを扱うところまでを目指したいと思います。
そのためには、以下のような準備が必要となってきます。
・管理オブジェクトモデルの作成
・永続ストアコーディネータの作成
・管理オブジェクトコンテキストの作成
・データモデルファイルの作成
・エンティティの定義
・エンティティに対応するクラスの作成。
一見すると面倒なような気がしますが、自前でやるよりは簡単だと思います。
詳しくは次回以降ということで。