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
'아이폰 개발 > 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 |