来るとは思っていましたが、NSURLConnectionは、Xcode7(iOS9)から非推奨となりました。
こうなると、いつかは消えてしまう(使えなくなる)運命に・・・。
切り替える時間がないとか、新しいのは嫌い(笑)とかいわずに
非推奨のうちに、NSURLSessionに切り替えてしまいましょう!
今回は、”GET”です。
検証環境
Xcode 7beta5
iOS 8.4.1
Objective-C
通信前の準備
通信するための情報を設定していきます。
requestの作成
アドレス、Headerの部分の作成。
この部分は、NSURLConnectionをそのまま流用できます。
// Header 作成 NSMutableURLRequest *request = [NSMutableURLRequest new]; [request setURL :[NSURL URLWithString:@"https://xxxx.co.jp"]]; [request setCachePolicy :NSURLRequestReloadIgnoringLocalCacheData]; [request setValue :@"identity" forHTTPHeaderField:@"Accept-encording"]; [request setValue :@"no-cache" forHTTPHeaderField:@"Cache-Control"]; [request setHTTPMethod :@"GET"];
time outの設定
NSURLSessionからTimeOutの設定が、RequestとResoruceの両方の設定ができるようになります。
// セッション作成 NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; // タイムアウトの設定 sessionConfig.timeoutIntervalForRequest = 10; sessionConfig.timeoutIntervalForResource = 20;
NSURLsessionの設定
NSURLsessionの設定内容
1.sessionWithConfiguration(time out)
2.delegate
3.delegateQueue
// 通信設定 self.sessionConnect = [NSURLSession sessionWithConfiguration: sessionConfig delegate: self delegateQueue: [NSOperationQueue mainQueue]];
NSURLDataTaskの設定
最後は今まで設定したのをまとめるだけ
NSURLSessionDataTask *dataTask = [self.sessionConnect dataTaskWithRequest:request];
通信開始
開始は”resume”
// 通信開始 [dataTask resume];
delegate methodの設定
読み込み途中、読み込み結果を取得するdelegate methodの設定をしていきます。
delagate methodは3つ
– (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler;
– (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data;
– (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error:
どのメッソッドも長すぎです(笑)
– (void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler;
このメソッドは、requestを投げた結果が返ってきます。
返ってきた情報から、通信を続けるのか、終了するのかをcompletionHandlerを使用して返します。
// レスポンス処理 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; // Headerの情報の確認 if (httpResponse.statusCode == 200) { completionHandler(NSURLSessionResponseAllow); // 続ける } else { // error.code = -999で終了メソッドが呼ばれる completionHandler(NSURLSessionResponseCancel); // 止める } }
– (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data;
サーバーからデータを受信すると呼ばれます。
// 受信データ処理 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { // 受信データ格納 [self.recevedData appendData:data]; // printf("/*%s*/\n",[[NSString stringWithFormat:@"%zd",[data length]] UTF8String]); }
– (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error:
通信が完了したり、通信失敗すると呼ばれます。
errorで通信完了か、通信失敗かを判断
// 終了処理 [正常終了、エラー終了、途中終了でもこのメソッドが呼ばれる] - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { if (!error) { // // 正常終了 // } else { // // エラー終了 // } [session invalidateAndCancel]; }
まとめ
駆け足で説明してきてしまいましたが
NSURLSessionへの変更が簡単にできそう!と思っていただけましたでしょう?
time outエラーはきっちりと動作してくれますので別にtimerを用意したりする必要がありません。
ありがたいです。
ソースコード
#define TIME_OUT_REQUEST 5 #define TIME_OUT_RESOURCE 20 @interface ConnectionGET ()<NSURLSessionDataDelegate> // Var @property (nonatomic) NSURLSession *sessionConnect; @property (nonatomic) NSMutableData *recevedData; @end @implementation ConnectionGET - (void)startDownLoad { // 初期化 self.recevedData = [NSMutableData data]; // セッション作成 NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; // タイムアウトの設定 sessionConfig.timeoutIntervalForRequest = TIME_OUT_REQUEST; sessionConfig.timeoutIntervalForResource = TIME_OUT_RESOURCE; // 通信設定 self.sessionConnect = [NSURLSession sessionWithConfiguration: sessionConfig delegate: self delegateQueue: [NSOperationQueue mainQueue]]; // Header 作成 NSMutableURLRequest *request = [NSMutableURLRequest new]; [request setURL :[NSURL URLWithString:@"https://xxxx.co.jp"]]; [request setCachePolicy :NSURLRequestReloadIgnoringLocalCacheData]; [request setValue :@"identity" forHTTPHeaderField:@"Accept-encording"]; [request setValue :@"no-cache" forHTTPHeaderField:@"Cache-Control"]; [request setHTTPMethod :@"GET"]; NSURLSessionDataTask *dataTask = [self.sessionConnect dataTaskWithRequest:request]; // ダウンロード開始 [dataTask resume]; } // レスポンス処理 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; if (httpResponse.statusCode == 200) { completionHandler(NSURLSessionResponseAllow); // 続ける } else { // error.code = -999で終了メソッドが呼ばれる completionHandler(NSURLSessionResponseCancel); // 止める } } // 受信データ処理 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { // 受信データ格納 [self.recevedData appendData:data]; } // // 終了処理 [正常終了、エラー終了、途中終了でもこのメソッドが呼ばれる] - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { if (!error) { // // 正常終了 // } else { // // エラー終了 // } [session invalidateAndCancel]; } @end
コメント