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


コメント