본문 바로가기
아이폰 개발/ios 개념&튜토리얼

NSURLSession 공통 모듈 예제

by 인생여희 2021. 1. 29.

NSURLSession 공통 모듈 예제

 

NSURLSession을 델리게이트 패턴으로 만들어서 사용할 수 있도록 설계했다.

 

 

SessionObj.h

 

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN


//세션 호출시 알려주기 위한 비공식 프로토콜 (델리게이트)
@protocol MySessionDelegate <NSObject>
-(void) getResultDataFromMySessionData;
@end

@interface SessionObj : NSObject <NSURLSessionDataDelegate>


//세션 호출시 알려주기 위한 델리게이트 프로퍼티
@property (nonatomic , weak) id <MySessionDelegate> mySessionDelegate;

@property (strong, nonatomic) NSDictionary *resultData;
@property int resultCode; // 정상응답 : 200 , 문제 : 404
@property int finishCode; // 정상 : 1, 비정상 : 0



@property (strong , nonatomic) NSURLSession *session;
@property (strong , nonatomic) NSURLSessionDataTask *task;
@property (strong , nonatomic) NSURLSessionConfiguration *conf;


-(void)startWithURL:(NSURL *) url;

@end

NS_ASSUME_NONNULL_END

 

 

SessionObj.m

 

#import "SessionObj.h"

@implementation SessionObj


- (id)init
{
    self = [super init];
    if (self) {
        _conf = [NSURLSessionConfiguration defaultSessionConfiguration];
            
        //셀룰러 연결 허용
        _conf.allowsCellularAccess = YES;
        
        //최근데이터 사용
        _conf.requestCachePolicy = NSURLRequestReturnCacheDataElseLoad;
    }
    return self;
}



//통신 시작
-(void)startWithURL:(NSURL *) url{
    
    NSString *temURL = url.absoluteString;

    NSLog(@"호출 url : %@" , temURL);
    
    _session =
    [NSURLSession sessionWithConfiguration:_conf delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    
    _task = [_session dataTaskWithURL:url];
              
    [_task resume];
}


//응답 수신 시 처리
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
    
    NSLog(@"didReceiveResponse");
    
    
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
    
    int status = (int)[httpResponse statusCode];
    
    if (status == 200) {
        
        NSLog(@"200 : 응답성공");
        
        //데이터 저장용 객체 초기화
        self.resultData = [[NSMutableDictionary alloc]init];
        self.resultCode = status;
        
        completionHandler(NSURLSessionResponseAllow);
        
    }else{
        
        self.resultCode = status;
        
        completionHandler(NSURLSessionResponseCancel);
    }
    
}

//데이터가 읽혀질 때마다 호출
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{
    
    NSLog(@"session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data - 시작");
    
    NSError *error = nil;
    NSDictionary* json = [NSJSONSerialization
                          JSONObjectWithData:data
                          options:kNilOptions
                          error:&error];
    
    if (!error) {
        self.resultData = json;
    }
}


//처리 완료 or 에러 처리
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
    
    if (!error) {
        
        NSLog(@"처리완료");
        self.finishCode = 1;
        
    }else{
        NSLog(@"에러");
        self.finishCode = 0;
    }
        //델리게이트 메소드 호출
        [self.mySessionDelegate getResultDataFromMySessionData];
}



//NSURLSession 델리게이트 메소드
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didBecomeStreamTask:(NSURLSessionStreamTask *)streamTask{
    NSLog(@"didBecomeStreamTask");
}


- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask{
    
    NSLog(@"didBecomeDownloadTask");
    
}


@end

 

 

호출해서 사용하기

 

ViewController.h

 

#import "SessionObj.h"


#import <UIKit/UIKit.h>

//세션 모듈 델리게이트 채택
@interface ViewController : UIViewController <MySessionDelegate>

//사용할 세션 객체 
@property (strong,nonatomic) SessionObj *session;

@end

 

 

ViewController.m

 

#import "ViewController.h"


@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [[ComLog sharedObject] showLog:__PRETTY_FUNCTION__ line:__LINE__ logs:@"시작"];
    
    NSURL *testurl = [NSURL URLWithString:@"https://reqres.in/api/users/2"];
       
    //NSURL Session 초기화

    self.session = [[SessionObj alloc]init];
    
    self.session.mySessionDelegate = self;
  
}

//통신 세션이 완료되면 호출되는 델리게이트 메소드
-(void)getResultDataFromMySessionData{
    
    NSLog(@"getResultDataFromMySessionData viewDidLoad 메소드 진입");
    NSLog(@"session.resultCode : %d" , self.session.resultCode);
    NSLog(@"session.finishCode : %d" , self.session.finishCode);
    NSString *resultString =  [NSString stringWithFormat:@"%@", self.session.resultData];
    NSLog(@"resultData : %@" , resultString);
    
}

@end

 

 

 

NSUrlSession_Singleton.zip
0.07MB

'아이폰 개발 > ios 개념&튜토리얼' 카테고리의 다른 글

iOS UIActivityIndicatorView 예제  (0) 2021.02.02
iOS WKWebView 예제  (0) 2021.01.30
iOS 공통 로그 예제  (0) 2021.01.28
디자인 패턴 - 싱글톤 패턴 예제  (0) 2021.01.28
iOS AVPlayer 예제  (3) 2021.01.26