libro
www.tuyano.com
初心者のためのObjective-Cプログラミング入門

NSURLとNSURLConnection (4/6)

作成:2011-02-23 09:40
更新:2011-11-13 21:59

■NSURLConnectionによる同期通信

まずは、比較的簡単な同期通信から行いましょう。これは、実際にサンプルコードを見てもらい、それをもとに説明をしていったほうが分かりやすいでしょう。

下のリスト欄に掲載したのが、同期通信でwww.apple.comのデータを取得し表示するサンプルです。では、先に説明した手順を思い出しながら、処理の流れを見ていきましょう。

1.まず、接続先のNSURLを用意します。これはNSStringでアドレスを用意してNSURLを作成すればいいだけですね。

2.NSURLRequestインスタンスを用意します。これはrequestWithURL:というコンビニエンスコンストラクタを利用します。以下のようにNSURLを引数に渡してインスタンスを作成します。これで、指定のアドレスに接続するためのリクエストが用意されます。
NSURLRequest* 変数 = [NSURLRequest requestWithURL:《NSURL*》];
3.NSURLResponseNSErrorの変数を用意しておきます。これは、必要に応じてオブジェクトが書き込まれるものなので、どちらもnilの状態のままでOKです。

4.NSURLConnectionのメソッドを呼び出して同期接続を開始します。これは「sendSynchronousRequest: returningResponse: error:」という長ったらしいメソッドを用います。NSURLRequestNSURLResponseNSErrorそれぞれを引数に用意します。NSURLResponseNSErrorは、それぞれポインタのポインタで渡します。
NSData* 変数 = [NSURLConnection sendSynchronousRequest:《NSURLRequest*》
        returningResponse:《NSURLResponse**》 error:《NSError**》];
同期通信なので、このメソッドを呼び出した時点で通信が開始されます。そしてすべての通信が終了すると、返値として「NSData」が返されます。このNSDataというクラスは、バイナリデータを扱うためのクラスなのです。つまり、受け取ったデータが、NSDataという形で返ってくるわけですね。

5.受け取ったNSDataは、まだバイナリデータなので、これをテキストに戻さないといけません。NSStringには、NSDataのバイナリデータをもとに初期化をするためのメソッドが用意されているので、それを利用します。
NSString* 変数 = [[NSString alloc] initWithData:《NSData》 encoding:エンコード名];
これで、通信して得られた結果がNSStringとして受け取れました! ここではHTMLページにアクセスしたので最終的にテキストにしていますが、もちろん、グラフィックなどのデータも受け取ることができます。この場合は、NSDataをファイルに出力するなどすれば、グラフィックファイルをダウンロードできます。このへんは、NSDataについてもうちょっと勉強する必要がありますが、とりあえず「通信出来ればどんなデータでもこのやり方で受け取れる」ということはわかったでしょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    @autoreleasepool {
        NSString* address = @"http://www.apple.com/";
        NSURL* url = [NSURL URLWithString:address];
        NSURLRequest* request = [NSURLRequest 
                                 requestWithURL:url];
        NSURLResponse* response = nil;
        NSError* error = nil;
        NSData* data = [NSURLConnection
                        sendSynchronousRequest:request
                        returningResponse:&response
                        error:&error];
        NSString* result = [[NSString alloc]
                            initWithData:data
                            encoding:NSASCIIStringEncoding];
        NSLog(@"%@",result);
    }
    return 0;
}
※関連コンテンツ

「初心者のためのObjective-Cプログラミング入門」に戻る