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



コメント