※本記事は、旧ブログからの再掲です。

iPhoneアプリとサーバーとの通信方法には、同期通信と非同期通信があります。

同期通信では、サーバーにリクエストを送り、そのレスポンスが返ってきてデータを全て受信するまで待ちます。その間、次の処理に遷移することはできません。ユーザーの画面操作にも反応できないため、すぐに処理が完了する場合や次の処理に遷移するにはサーバーからの返答が必要な場合などに使用することになると思います。

非同期通信では、サーバーにリクエストを送った後そのレスポンスを待つ必要はなく、次の処理に遷移できます。サーバーからレスポンスが返ってきてデータを全て受信すると予め指定してあった処理が呼び出され、必要な処理を行うことができます。

今回は、iPhone側からリクエストを送り、レスポンスをXMLで受け取る方法です。

同期通信
NSURLConnection の sendSynchronousRequest:returningResponse:error: というメソッドを使用してサーバーにリクエストを送信します。
リクエスト情報、レスポンス情報格納エリア(ポインタ)、エラー情報格納エリア(ポインタ)を引数で渡します。
リクエスト情報(IN):NSURLRequest *
レスポンス情報格納エリア(OUT):NSURLResponse **
エラー情報格納エリア(OUT):NSError **
サーバー側で処理が終了しレスポンスが返ってくると戻り値として、NSDataが返されます。
今回の場合には、XMLデータが返されるので、XMLParserで解析しています。
レスポンス情報は以下に示した通り、いろいろな情報が得られますが、statusCodeだけ見て処理を行っています。

 

非同期通信
NSURLConnectionのinitWithRequest:delegate:というメソッドを使用してサーバーにリクエストを送信します。
リクエスト情報、デリゲートクラスのインスタンスを引数で渡します。
リクエスト情報(IN):NSURLRequest *
デリゲートクラスのインスタンス(IN):id
レスポンスは、デリゲートメソッドが受信します。
以下4つのdelegateメソッドの実装が必要となります。
・connection:didReceiveResponse:(レスポンス受信時に1回のみ)
・connection:didReceiveData:(コンテンツデータ受信時。断片的なデータを通信が終了するまで何度も)
・connection:didFailWithError:(エラー発生時)
・connectionDidFinishLoading:(通信完了時に1回のみ)

今回は、サーバーとの送受信を行うクラス(NetworkConnector)を用意し、そちらでリクエスト送信とレスポンス受信を行っています。
また、デリゲート処理側では、受信完了時にサーバー側からのレスポンスデータを正常に受信できたか判断し、メイン処理側のメソッドを呼び出すようにしています。正常に受信出来ていた場合には、メイン処理側で取得したデータ(XML)を解析しています。

■ メイン処理

 

■ サーバーと送受信を行うクラス

<参考>
[Appleドキュメント] ネットワーキングオーバービュー

 


Comments are closed.