Objective-CでHTTP通信するためにNSURLSessionを使ってみました。
参考:https://developer.apple.com/documentation/foundation/nsurlsession
やりたい事
- HTTP GET
- 取得するデータは小さいものを想定しています。
注意した点
- 取得するデータサイズが小さいのでtaskはNSURLSessionDataTaskを使用しました。
- 処理を単純化させるためにdelegateは使用しませんでした。
- UI関連の処理を想定していないため、delegateQueueは独自に作成しました。
- NSURLSessionはdelegateQueueに強い参照を持つため、invalidateをしないとメモリリークするので注意が必要です。
サンプルコード
YKTHttpClient.h
# import <Foundation/Foundation.h>
@interface YKTHttpClient : NSObject
// Var
@property (nonatomic) NSURLSession *urlSession;
- (void)getWithUrlString:(NSString *)urlString;
@end
YKTHttpClient.m
# import "YKTHttpClient.h"
@implementation YKTHttpClient
- (id)init {
NSLog(@"init");
if (self = [super init]) {
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfig.timeoutIntervalForRequest = 5;
sessionConfig.timeoutIntervalForResource = 20;
// 処理を単純化させるためにdelegateは使用しませんでした。
// UI関連の処理を想定していないため、delegateQueueは独自に作成しました。
self.urlSession = [NSURLSession sessionWithConfiguration: sessionConfig
delegate: nil
delegateQueue: nil];
}
return self;
}
- (void)getWithUrlString:(NSString *)urlString {
NSLog(@"get start");
NSMutableURLRequest *request = [NSMutableURLRequest new];
[request setURL :[NSURL URLWithString:urlString]];
[request setCachePolicy :NSURLRequestReloadIgnoringLocalCacheData];
[request setValue :@"YKTHttpClient" forHTTPHeaderField:@"User-Agent"];
[request setHTTPMethod :@"GET"];
// 取得するデータサイズが小さいのでtaskはNSURLSessionDataTaskを使用
NSURLSessionDataTask *dataTask
= [self.urlSession dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSHTTPURLResponse *httpUrlResponse = (NSHTTPURLResponse *)response;
NSLog(@"Status code: %ld", httpUrlResponse.statusCode);
CFStringEncoding encoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)[response textEncodingName]);
NSString *body = [[NSString alloc] initWithData:data encoding:CFStringConvertEncodingToNSStringEncoding(encoding)];
NSLog(@"body : %@...", [body substringToIndex:20]);
}];
[dataTask resume];
NSLog(@"get end");
}
-(void) dealloc {
NSLog(@"dealloc");
[self.urlSession invalidateAndCancel];
}
@end