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