URLSession, URLSessionTask에 대한 내용이 담긴 링크를 아래에 남기겠습니다.
URL Loading System
https://developer.apple.com/documentation/foundation/url_loading_system
https://velog.io/@panther222128/URL-Loading-System
URLSessionTask
https://developer.apple.com/documentation/foundation/urlsessiontask
https://velog.io/@panther222128/URLSessionTask
https://developer.apple.com/documentation/foundation/urlsession
"An object that coordinates a group of related, network data-transfer tasks."
class URLSession : NSObject
네트워크를 통해 데이터 전송 수행을 담당하는 그룹을 조직화하는 객체입니다.
URLSession
클래스 그리고 이 클래스와 관련이 있는 클래스들은 URL에 의해 나타나는 엔드포인트로부터 데이터를 다운로드하거나 업로드하는 API를 제공합니다. 앱이 실행되고 있지 않거나 중지된 상태일 때도 데이터를 다운로드 받을 수 있도록 하기도 합니다. 또한, URLSessionDelegate
와 URLSessionTaskDelegate
를 통해 authentificaion을 지원하기도 하고, 재연결이나 수행 완료 같은 이벤트를 받을 수도 있습니다.
Note
URLSession
API는 여러 클래스와 연관이 있는데, r레퍼런스 문서만을 읽는 것만으로는 사용하기에 복잡해보일 수 있습니다. API를 사용하기 전에 URL Loading System 주제에 나와있는 오버뷰를 읽어보시길 권합니다. 그 문서에 필수요소, 업로드, 다운로드 섹션이 포함되어 있으며, 일반적인 사용방법에 대한 예제를 제공하고 있습니다.
URL Loading System
https://developer.apple.com/documentation/foundation/url_loading_system
https://velog.io/@panther222128/URL-Loading-System
앱은 하나 혹은 그 이상의 URLSession
인스턴스를 생성하게 될 것입니다. 각각은 데이터가 오고 가는 수행에 조직화되어 있을 것입니다. 예를 들어 만약 웹 브라우저를 생성하려고 한다면, 탭 하나에 하나의 세션이나 윈도우 혹은 상호작용을 위한 세션을 생성해야 할 것입니다. 또한, 앱이 백그라운드 상태에서 다운로드가 지속되길 원한다면 별도의 세션이 필요합니다. 각 세션 내에서 앱은 정해놓은 URL에서 요청을 보내는 연속적인 수행을 추가하게 될 것입니다.
주어진 URL 세션 내에서 이뤄지고 있는 수행은 일반적인 세션 설정 객체를 공유합니다. 이 객체는 단일 호스트를 만들기 위한 최대 동시 연결 개수, cellular 네트워크를 사용할 수 있도록 할 것인지 등을 정의하도록 합니다.
URLSession
은 설정 객체를 갖고 있지는 않은 싱글턴을 갖고 있습니다. 생성하려고 하는 세션의 커스텀이 필요없고, 제한된 요구사항만을 가지고 있다면 쉽게 접근할 수 있도록 도와줄 것입니다. 싱글턴을 호출하면 쉽게 접근할 수 있습니다. 다른 종류의 세션을 생성하려면 아래 세 가지 중 하나일 것입니다.
각각의 설정을 생성하길 원한다면, URLSessionConfiguration
클래스 내에 Creating a Session Configuration Object를 살펴보시길 권합니다.
URLSessionConfiguration
https://developer.apple.com/documentation/foundation/urlsessionconfiguration#1660412
세션 내에서 서버에 데이터를 선택적으로 업로드하는 작업을 생성할 수 있으며, 파일을 디스크에 불러오거나 하나 이상의 NSData
객체를 메모리에 불러올 수 있습니다. URLSession
API는 네 가지 유형의 작업을 제공합니다.
NSData
객체를 사용해 데이터를 보내고 받을 수 있습니다. 데이터 작업은 작은 단위로 여러번 서버에 요청합니다.세션의 수행은 일반적인 딜리게이트 객체를 공유합니다. 특정 이벤트가 발생했을 때 정보를 제공하고 얻기 위해 이 딜리게이트를 사용합니다. 대표적인 예시는 아래와 같습니다.
딜리게이트에 의해 제공되는 것들이 필요하지 않다면, 세션 생성 시 nil
을 전달시켜주는 것을 통해 이 API를 사용할 수 있습니다.
Important
세션 객체는 앱이 종료되거나 세션이 무효화될 때까지 딜리게이트에 강한 참조를 유지하고 있습니다. 만약 세션을 무효화하지 않는다면 앱 종료까지 메모리 누수가 발생합니다.
대부분의 네트워킹 API처럼 URLSession
API는 비동기입니다. 두 가지 방법으로 데이터를 반환할 수 있으며, 작성하는 메소드에 따라 달라집니다.
이러한 정보를 딜리게이트에 전달하는 것과 더불어, URLSession
은 현재 상태를 제공합니다. 또한, 작업의 현재 상태에 따라 어떻게 결정할 것인지에 대해 쿼리할 수 있는 프로그레스 속성을 제공합니다.
URLSession
클래스는 데이터, 파일, ftp, http, https URL 스킴을 지원합니다. 그리고 이러한 지원은 프록시 서버와 SOCKS 게이트웨이와 함께합니다. 이들은 사용자 시스템의 prefrence가 설정된 형태로 이뤄집니다.
URLSession은 HTTP/1.1과 HTTP/2 프로토콜을 지원합니다. RFC 7540에 명시된 것처럼 HTTP/2는 Application-Layer Protocol Negotiation(ALPN)을 지원하는 서버에 요청할 수 있습니다.
가지고 있는 커스텀 네트워킹 프로토콜을 추가할 수도 있고, URLProtocol
을 상속받은 객체를 만들면서 URL 스킴 또한 추가할 수 있습니다.
iOS 9.0과 macOS 10.11 이후 버전은 URLSession
으로 만들어진 모든 HTTP 연결에 대해 App Transport Security(ATS)를 사용합니다. ATS는 HTTP 연결이 HTTPS(RFC 2818)를 사용하길 요청합니다.
더 많은 정보가 필요하다면 NSAppTransportSecurity
를 살펴보시길 권합니다.
세션과 작업 객체는 NSCopying
프로토콜을 따르며, 이 프로토콜은 아래와 같습니다.
URLSession
API는 스레드 세이프합니다. 자유롭게 세션과 작업을 생성할 수 있습니다. 딜리게이트 메소드가 컴플리션 핸들러를 호출할 때, 작업은 자동으로 올바른 딜리게이트 큐에 스케줄됩니다.