sos の 作業メモ

プログラミングや英会話学習、マイルや旅行、日常生活など。最近はWebFormなASP.NETのお守りがお仕事です。

日々の生活にhappyをプラスする|ハピタス Gポイント

HTTPでPOST その2 接続

前回の続き

NSURLConnection

NSURLRequestを作ったら、それを使ってNSURLConnectionのインスタンスを作ります。インスタンスがなくても通信はできるのだけど、Viewを閉じたり、ApplicationがInactivateされた時にも、きちんと通信をキャンセルできるように準備するのが、お行儀のよいアプリ。

まずは、コネクションと、delegateでresponseを保持するための変数をクラスに追加。

    NSURLConnection* _conn;
    NSHTTPURLResponse* _httpRes;
    NSData* _resData;

前回作ったメソッドに渡すパラメータを作成し

    NSMutableDictionary* params = [NSMutableDictionary dictionary];
    [params setObject:@"value1" forKey:@"key1"]; //  パラメータ
    NSURL* url = [NSURL URLWithString:@"http://hoge.hoge/hoge"];

リクエストオブジェクトを作って NSURLConnectionオブジェクトを生成するだけ。

    NSURLRequest* req = [NetTool createHttpPostRequest:url withParams:params timeoutInterval:60];
    _httpRes = nil;        
    _conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];

これで指定のURLに対してrequestが発行されました。

NSURLConnectionDataDelegate

delegateで非同期通信の結果を受け取ります。以下の4つのメソッドを実装しておけば普通は大丈夫。

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    _conn = nil;
}

サーバーが存在しなかったり回線が不安定でタイムアウトしたりと、通信エラーの際にはこのメソッドが呼ばれる。

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [_resData setLength:0];
    if([response isKindOfClass:[NSHTTPURLResponse class]]){
        _httpRes = (NSHTTPURLResponse*)response;
    }
}

HTTPヘッダを受信した際に呼ばれる。 受信したデータを格納するためのNSDataオブジェクトを初期化し、後でHTTP ヘッダや応答ステータスを参照するために、レスポンスオブジェクトを保存する

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [_resData appendData:data];
}

bodyを受信した際に呼ばれる。データをバッファに追記してもよし、都度処理してもよし。Content-Length次第で複数回呼ばれることを考慮すること。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    _conn = nil;
}

通信エラーが発生した時以外は、必ずこのメソッドが最後に呼ばれる。受け取ったデータを解析したり、画面表示を変えたりといった処理をここで行う。