Objective-CでHTTP通信(NSURLSession)


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