[Objective-C] URLSessionテンプレート

2016年2月20日

Objective-C テクノロジー プログラミング

UIWebViewを使用している時に、データを端末にダウンロードさせたい時などにURLセッション関数を使ってデータパケットを受け取る事ができる。 ただし、1回に受け取るパケット量の上限が決まっているため、大きな容量を受け取るときは、受け取ったパケットを繋ぎあわせて、データ保管を行わなければならない。 が、この処理ができると、非常にアプリの幅が広がるのでダウンロード処理を行って、公衆回線よりもwifiダウンロードが行えるエコなアプリを目指そう!

テンプレートコード

viewController.h

@interface viewController : UIViewController< NSURLSessionDelegate,NSURLSessionDataDelegate,NSURLSessionTaskDelegate > { float DL_size_add; NSMutableData *receivedData; }

viewController.m

// リクエスト開始 NSURL *url = [NSURL URLWithString:urlEncode]; NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:root_obj delegateQueue:[NSOperationQueue mainQueue]]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; NSURLSessionDataTask *task = [session dataTaskWithRequest:request]; [task resume]; /** * HTTPリクエストのデリゲートメソッド(データ受け取り初期処理) */ - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { // Header情報の取得 NSDictionary* headers = [(NSHTTPURLResponse *)response allHeaderFields]; NSString *str = headers[@"Content-Length"]; //ファイルの総容量 int *data_size = str.integerValue; //DLを経過容量(累積値)※グローバル変数を利用する DL_size_add = 0; // receiveDataはフィールド変数※グローバル変数を利用する receivedData = [[NSMutableData alloc] init]; //インジケーター開始 [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; // Headerの情報の確認 NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; if (httpResponse.statusCode == 200) { completionHandler(NSURLSessionResponseAllow); // 続ける } // error.code = -999で終了メソッドが呼ばれる else { completionHandler(NSURLSessionResponseCancel); // 止める } } /** * HTTPリクエストのデリゲートメソッド(受信の度に実行) */ - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { // 1つのパケットに収まらないデータ量の場合は複数回呼ばれるので、データを追加していく DL_size_add += data.length; [receivedData appendData:data]; // shelf-progress-reload [self setShelfDownloadBar]; } /** * HTTPリクエストのデリゲートメソッド(完了処理) */ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { //インジケーター起動 [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; //終了処理 [session invalidateAndCancel]; }

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。