LoginSignup
5
3

More than 5 years have passed since last update.

Objective-CでHTTP通信(NSURLSession)

Last updated at Posted at 2018-05-02

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
5
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3