来るとは思っていましたが、NSURLConnectionは、Xcode7(iOS9)から非推奨となりました。
こうなると、いつかは消えてしまう(使えなくなる)運命に・・・。
切り替える時間がないとか、新しいのは嫌い(笑)とかいわずに
非推奨のうちに、NSURLSessionに切り替えてしまいましょう!
今回は、”GET”です。
検証環境
Xcode 7beta5
iOS 8.4.1
Objective-C
通信前の準備
通信するための情報を設定していきます。
requestの作成
アドレス、Headerの部分の作成。
この部分は、NSURLConnectionをそのまま流用できます。
1 2 3 4 5 6 7 |
// 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の両方の設定ができるようになります。
1 2 3 4 5 6 |
// セッション作成 NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; // タイムアウトの設定 sessionConfig.timeoutIntervalForRequest = 10; sessionConfig.timeoutIntervalForResource = 20; |
NSURLsessionの設定
NSURLsessionの設定内容
1.sessionWithConfiguration(time out)
2.delegate
3.delegateQueue
1 2 3 4 |
// 通信設定 self.sessionConnect = [NSURLSession sessionWithConfiguration: sessionConfig delegate: self delegateQueue: [NSOperationQueue mainQueue]]; |
NSURLDataTaskの設定
最後は今まで設定したのをまとめるだけ
1 |
NSURLSessionDataTask *dataTask = [self.sessionConnect dataTaskWithRequest:request]; |
通信開始
開始は”resume”
1 2 |
// 通信開始 [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を使用して返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// レスポンス処理 - (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;
サーバーからデータを受信すると呼ばれます。
1 2 3 4 5 6 7 8 9 |
// 受信データ処理 - (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で通信完了か、通信失敗かを判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// 終了処理 [正常終了、エラー終了、途中終了でもこのメソッドが呼ばれる] - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { if (!error) { // // 正常終了 // } else { // // エラー終了 // } [session invalidateAndCancel]; } |
まとめ
駆け足で説明してきてしまいましたが
NSURLSessionへの変更が簡単にできそう!と思っていただけましたでしょう?
time outエラーはきっちりと動作してくれますので別にtimerを用意したりする必要がありません。
ありがたいです。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
#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 |