iOSネットワークリクエスト(同期)

iOSでリクエストを送る方法です。
リクエストを送る方法には, 同期, 非同期とありますが, 今回は同期編です。

同期でも良さそうな場合

  • 小さいデータのやり取り
  • UIの動作をとめておいても良さそうな場合

このリクエストを, バックグラウンドタスクでやらない場合はmainスレッドで動作しますよね。
そうすると, 動作中はメソッドの部分で止まります。待ちでもよければそのままでいいのですが,
UIの操作などがしたい場合は, 同期であれ, バックグラウンドでしておけばよいでしょう。
(Androidだとエラーになりますね)

小さいデータの場合, 非同期だとオーバースペック気味に感じます。であれば, バックグラウンド + 同期で十分だと思います。
バックグラウンドタスクに関するものは,
NSOperationを使用したバックグラウンド処理, dispatch_asyncでバックグラウンドタスク,を参照してください。

同期ではない場合

  • HTTPSなど認証が必要な場合
  • ダウンロードの状態など, 途中経過が必要な場合
  • データを少しずつ送信したい場合
  • 途中でキャンセルしたい場合

基本的に, リクエストを送信する際に, 途中で何か入れたい場合などが該当します。

サンプル

-(void)doSyncRequest:(NSString *)urlString {
    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *req = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30.0];
    // Send request and wait for a response
    NSHTTPURLResponse *resp;
    NSError *error = nil;
    
    // Return data is NSData
    NSData *data = [NSURLConnection sendSynchronousRequest:req returningResponse:&resp error:&error];
    
    if ( error != nil ) {
        NSLog(@"Error on load - %@", [error description]);
    }
    // Check status
    if ( [resp isKindOfClass:[NSHTTPURLResponse class]]) {
        if ( resp.statusCode != 200 ) {
            return;
        }
// Process data ?
    }
}

このサンプルは, NSRequestを作成して, GETを送信した場合です。取得したデータは, NSData として
保存しています。 レスポンスである, NSHTTPURLResponse のレスポンスコードをチェックして, 200であれば操作を続行するような形です。

必要であれば, NSURLのチェックや, Reachabilibyを使ったネットワークのチェックなど(iOS(ネットワークの接続状態の検出))を利用した方が確実です。
エラーチェックはかならずしておきましょう。