NSURLSession で”GET”しよう!

スポンサーリンク
Sample Code

20160203_001
来るとは思っていましたが、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

 

コメント

タイトルとURLをコピーしました