🔅NSURLSession 은 언제 사용하면 좋을까?
아이폰으로 웹서버에 접속해서 Json 형식의 데이터를 수신하거나, XML 형식의 데이터를 수신하고 싶을때 사용한다. 아이폰에는 webKitView가 있지 않나? webKitView를 이용해서도 서버에 Url 요청을 할 수 있다. webKitView를 이용해서 하이브리드 앱을 만드는것 말고, 좀 더 네이티브스러운 디자인을 가진 앱을 만들고 싶을 때 사용한다. 그리고 Alamofire 같은 통신라이브러리 사용하기가 귀찮거나, 라이브러리 관리하기가 싫은 개발자들도 간단히 NSURLSession을 사용해서 get, post 통신을 할 수 있다.
🔅NSURLSession은 어떤 기능을 할까?
서버에 요청을 보내고 데이터를 응답받는것을 도와준다. NSURLSession은 앱이 실행되지 않을때, 일시중지된 상태에서도 다운로드 작업이 계속되도록 지원해준다. NSURLSession 클래스는 데이터, 파일, ftp, http 및 https를 지원한다. NSURLSession을 사용해서 여러 세션을 만들 수 있다. 여러 세션으로 데이터 전송작업(Task)그룹을 조정할 수도 있다.
예) 웹브라우저에서 새창을 열때 새로운 세션을 생성할 수 있다. 또한 다운로드를 위한 새로운 세션을 생성할 수도 있다.
앱은 세션에 관련 작업(Task)을 추가할 수도 있다. 작업은 특정 url에 대한 요청이라고 생각하면 된다. 주어진 URL 세션 안에서 작업(Task)은 하나의 세션에 얼마나 많은 연결이 가능한지, 셀룰러 네트워크로 연결 허용을 하는지 등 연결 설정을하는 공통 세션 설정 객체를 공유한다. 세션의 동작은 세션설정객체를 생성할 때, 호출되는 메소드에의해서 부분적으로 결정된다.
🔅NSURLSession 사용순서 - Swift 버전
1.세션을 만든다.
아래처럼 다양한 세션객체를 생성 할 수 있다.
// 기본요청을위한 싱글 톤 인 공유 세션
let session = NSURLSession.sharedSession ()
// 사용자 지정 가능성이 더 높은 공유 세션과 같은 기본 세션
let session = NSURLSession (configuration : NSURLSessionConfiguration.defaultSessionConfiguration ())
// 쿠키 및 캐시가없는 기본 세션과 마찬가지로 임시 세션은 브라우저의 시크릿 탭으로 생각해도된다.
let session = NSURLSession (configuration : NSURLSessionConfiguration.ephemeralSessionConfiguration ())
// 백그라운드 세션, 애플리케이션이 백그라운드에서 실행되는 동안 작업을 수행하는 세션
let session = NSURLSession (configuration : NSURLSessionConfiguration.backgroundSessionConfiguration (identifier))
2.요청 설정
// NSMutableURLRequest로 요청을 생성하고 래핑되지 않은 URL을 매개 변수로 전달
let request = NSMutableURLRequest (URL : UnwrappedURL)
3.요청에 대한 HTTP 메소드 설정
위에서 만든 NSMutableURLRequest를 사용하여 HTTPMethod를 호출한다.
// 여기서는 GET을 사용
request.HTTPMethod = "GET"
4.요청에 대한 매개변수 설정
NSMutableURLRequest를 사용해서 요청에 매개변수를 설정할 수 있다.
// 요청에 addValue 메소드 사용
request.addValue ( "value", forHTTPHeaderField : "key")
* 여기서 순서는 "키, 값"대신 "값, 키"
5.Task(작업) 생성
위에서 만든 정보를 이용해서 세션에 넣어주고 요청작업을 할 수 있다.
// 세션을 사용하여 Task 생성 및 요청
// 요청이있는 세션
let task = session.dataTaskWithRequest (NSURLRequest) {data, response, error) in
//코드
}
// 요청없는 세션
let task = session.dataTaskWithURL (unwrappedURL) {(data, response, error)
//코드
}
// 기본적으로 작업(Task)은 일시중지상태. resume 메소드로 작업 시작을 해준다.
task.resume ()
여기까지가 NSURLSession을 사용하는 순서이다. 다시 정리하면 아래와 같다.
1.세션생성
2.요청URL설정
3.HTTP 메소드 설정
4.매개변수 설정
5.작업시작
🔅Session과 관련된 클래스 및 메소드
NSURLSession과 관련해서 조금 더 자세하게 각각의 객체와 메소드 어떤것들이 있고, 어떤기능을 하는지 살펴보자
1.NSURLSession
NSURLSession 객체를 만들려면 NSURLSession의 sharedSession 메소드나 NSURLSessionConfiguration 클래스를 이용해 sessionWithConfiguration 메소드를 호출하면된다.
2.sharedSession
Session의 기본적인 (디폴트) 기능을 가지고 있다.
3.defaultSessionConfiguration
따로 설정하지 않으면 sharedSession와 동일한 기능을 가진다. global cache, 자격증명 (credential), cookie storage objects를 디스크에 저장한다.
4.ephemeralSessionConfiguration
defaultSessionConfiguration과 비슷하다. 하지만 cache, 자격증명 (credential), cookie 등 내용을 디스크에 저장하지 않는다.
즉, 세션관련 데이터가 메모리에 올라가 있다.
backgroundSessionConfiguration
앱이 suspend, not running 일 때도 background 에서 콘텐츠 업로드 및 다운로드가 가능하다.
NSURLSessionConfiguration 에는 configuration 및 요청타입에 따라서 요청을 수행하고 응답을 처리할 때 사용하는 URLCache 및 쿠키 저장 객체에 대한 참조가 포함되어 있다.Session의 task 들은 NSURLSessionDelegate 라는 공통된 delegate 를 공유하기때문에, 인증 실패, 서버로부터 데이터를 받은 시점, 데이터를 캐시할 준비가 된 시점 등 다양한 이벤트가 발생할 때 정보를 제공하기도하고, 받을 수 도 있다.
앱이 백그라운드에서 다운로드하고 업로드할 경우 NSURLSessionDownloadDelegate를 구현하는 구현체를 제공해야한다. 반면, delegate 가 제공하는 기능들이 필요하지 않은 경우 session을 만들 때 delegate 에 nil 을 할당해서 사용하면 된다.
참고 : Session 객체는앱 종료나 명시적인 session invalidates 를 호출하기 전까지 델리게이트에 대한 strong reference를 가진다. 그래서 session을 invalidate 를 시키지 않으면 메모리 누수가 발생할 수 있다.
🔅Tasks 관련 클래스 및 메소드
Session을 사용해서 데이터를 서버에 전달하거나 서버로부터 파일이나 여러개의 NSData object를 받을 수 있다.
NSURLSession 은 3가지 타입의 task 를 제공한다.
1.NSURLDataTask
NSData object를 이용해 데이터를 주고받는다. 서버에 대한 짧은 요청이나, 빈번한 요청을 위한 Task이다.
2.NSURLUploadTask
DataTask와 비슷하다. 데이터를 파일 형태로 업로드 할 수 있고, 앱이 실행되지 않는 동안 백그라운드에서 업로드를 지원한다.
3.NSURLDownloadTask
파일 형태로 데이터를 받는다. 앱이 실행되지 않는 동안에 백그라운드 다운로드, 업로드를 지원한다.
NSURLSession API 는 비동기로 작동을 한다. 호출되는 메서드에 따라 completionHandler block 또는 delegate로 데이터를 반환해준다. Delegate 말고도 NSURLSession 은 상태, 진행상태(progress)에 해당하는 속성을 제공한다. 그리고 중지, 재시작,취소 등을 지원한다. (suspended, resume, canceled)
✅NSURLSessionTask
NSURLSessionTask - 세션 내 작업의 기본 클래스
NSURLSessionDataTask - URL의 내용을 NSData 객체로 가져 오는task
NSURLSessionUploadTask - 파일을 업로드 한 다음 URL의 내용을 NSData 객체로 가져 오는 task
NSURLSessionDownloadTask - 디스크의 임시 파일로 URL의 내용을 검색하는 task
NSURLSessionStreamTask - TCP / IP 연결을 설정하는 task
✅NSURLSessionDelegate
NSURLSessionDelegate - 세션 수준 이벤트를 처리하는 delegate
NSURLSessionTaskDelegate - 모든 작업 유형에 공통된 작업 수준 이벤트를 처리하는 delegate
NSURLSessionDataDelegate - 데이터 및 업로드 작업과 관련된 작업 수준 이벤트를 처리하는 delegate
NSURLSessionDownloadDelegate - 다운로드 작업과 관련된 작업 수준 이벤트를 처리하는 delegate
NSURLSessionStreamDelegate - 스트림 작업과 관련된 작업 수준 이벤트를 처리하는 delegate
NSURLSession API는 NSURLConnection 및 NSURLDownload와 같은 다른 API와 공통으로 사용되는 클래스를 사용한다. 아래는 공통으로 사용되는 클래스다.
✅NSURL- URL이 포함된 Object
NSURLRequest : URL, 요청 메소드 등 URL 요청과 관련된 메타 데이터를 캡슐화한다.
NSURLResponse : 콘텐츠 MIME 유형 및 길이와 같은 요청에 대한 서버의 응답과 관련된 메타 데이터를 캡슐화한다.
NSHTTPURLResponse : 응답 헤더와 같은 HTTP 요청에 특정한 추가 메타 데이터를 추가한다.
NSCachedURLResponse : 캐싱 목적으로 서버 응답의 실제 본문 데이터와 함께 NSURLResponse 개체를 캡슐화한다.
✅참고
medium.com/@EldonChan/a-study-guide-nsurlsession-33e0c46f0c76
'아이폰 개발 > ios 개념&튜토리얼' 카테고리의 다른 글
IOS PUSH APNS 개념 (0) | 2020.12.03 |
---|---|
IOS NSURLSession으로 Get 요청 Post 요청 - 구현 (0) | 2020.12.03 |
코어 블루투스 - IOS Core Bluetooth (0) | 2020.10.25 |
코어 오디오 - AudioStreamBasicDescription 정보출력 (0) | 2020.08.12 |
코어 오디오 - 사운드 파일 생성 하기 (0) | 2020.08.12 |