iOSネットワークリクエスト(非同期簡易版)
前回に引き続いて, iOSでネットワークのリクエストをします。
今回は非同期です。
ネットワークの処理をやっている間, UIスレッドの操作ができます。
ただし今回のサンプルでは, HTTPSやダウンロードのプログレスなどはやっぱりできないです。
簡易的に,非同期を実現させています。
サンプル
このサンプルではブロックコードで非同期部分を処理しています。
NSOperationQueueの制限数にひっかかります。
mainQueueを取ってきてしまうと, 同期と同じでUIが操作できません。
個人的には, ブロックコードで処理できるというメリット以外に使用される場面があまり思い浮かびません。
-(void)queuedAsync:(NSString *)urlString { NSURL *url = [NSURL URLWithString:urlString]; NSURLRequest *req = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30.0]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [NSURLConnection sendAsynchronousRequest:req queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { if (error != nil ){ NSLog(@"Error on load %@", [error description]); } else { if ( [response isKindOfClass:[NSHTTPURLResponse class]]) { NSHTTPURLResponse *resp = (NSHTTPURLResponse *)response; if ( resp.statusCode != 200 ) { return; } } } }]; // NSOperationQueue has maximum concurrent number // Same as synch }
NSURLConnectionの, sendAsynchronousRequestを利用します。
そこに, queueと処理のブロックコードを入れます。
レスポンスが返ってきた処理はこのブロックに実装します。