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(ネットワークの接続状態の検出))を利用した方が確実です。
エラーチェックはかならずしておきましょう。