본문 바로가기
iOS

[iOS] URLSession API

by thoonk: 2021. 1. 21.
반응형

URLSession과 관련해서 기록해보겠습니다.

 

URLSession 

  • HTTP/HTTPS를 통해 콘텐츠(데이터)를 주고받기 위해 API를 제공하는 클래스입니다.
  • 앱이 실행중이지 않거나 일시 중단된 동안 백그라운드 작업을 통해 콘텐츠를 다운로드 하는 것을 수행하기도 합니다.
  • 이 API는 URLSessionDelegate URLSessionTaskDelegate를 사용하여 인증을 지원하고 리다이렉션과 task completion과 같은 이벤트를 수신할 수 있습니다.
  • 앱은 하나 이상의 URLSession 인스턴스를 생성하며 각 인스턴스는 관련 데이터 전송 작업 그룹을 조정합니다. 예를 들어, 웹 브라우저를 만드는 경우 앱은 탭 또는 창(window)당 하나의 세션을 만들 수 있습니다. 각 세션 내에서 앱은 특정 URL에 대한 요청을 나타내는 일련의 작업을 추가합니다.
  • Request와 Response를 기본 구조로 가지고 있습니다. Request는 서버로 요청을 보낼 때 어떤 메서드를 사용할 것인지 캐싱 정책은 어떻게 할 것인지 등의 설정을 할 수 있습니다. Response는 URL요청의 응답을 나타내는 객체입니다.

URLSession의 유형

이 타입은 URLSession의 configuration 프로퍼티 객체에 의해 결정됩니다.

  1. 기본 세션 (Default Session): 기본 세션은 shared 세션과 매우 유사하게 작동합니다. 디스크에 저장하는 방식입니다.
  2. 임시 세션 (Ephemeral Session): 기본 세션과 유사하지만 캐시, 쿠키 또는 자격 증명을 디스크에 저장하지 않습니다. 메모리를 통해 세션과 연결합니다. 따라서 앱이 세션을 만료시키면 세션과 관련한 데이터가 사라집니다.
  3. 백그라운드 세션 (Background Session): 앱이 실행되지 않는 동안 (별도의 프로세스로) 백그라운드에서 콘테츠 업로드 및 다운로드를 수행할 수 있습니다.

URLSession 생성

  • init(configuration:): 지정된 세션 구성으로 세션을 생성합니다.

  • init(configuration: delegate: delegateQueue): 지정된 세션 구성, 델리게이트,  operation queue로 세션을 생성합니다.

  • shared: 싱글턴 세션 객체

URLSession 구성

  • configuration: 세션에 대한 구성 객체입니다.

  • delegate: 세션에 대한 델리게이트입니다.


URLSessionTask

세션 작업을 하나로 나타내는 추상 클래스입니다. 하나의 세션 내에서 URLSession 클래스는 세 가지 작업 유형(Data Tasks, Upload Tasks, Download Tasks)을 수행합니다.

  1. Data Tasks : NSData 객체를 사용해서 데이터를 송수신합니다.
  2. Upload Task : data 객체 또는 파일 형태의 데이터를 업로드하는 작업을 수행합니다. 앱이 실행중이지 않을 때 백그라운드 업로드를 지원합니다.
  3. Download Tasks : 데이터를 다운로드 받아서 파일의 형태로 저장하는 작업을 수행합니다. 앱이 실행중이지 않을 때 백그라운드 다운로드를 지원합니다.

JSON, XML, HTML 데이터 등 단순한 데이터의 전송에는 주로 데이터 작업을 사용하며, 용량이 큰 파일의 경우 앱이 백그라운드 상태인 경우에도 전달할 수 있도록 업로드(다운로드) 작업을 주로 사용합니다. 

 

세션에 Data task 추가하기

  • dataTask(with:) - URL에 데이터를 요청하는 작업을 객체를 생성합니다.

  • dataTask(with:completionHandler:) - URL에 데이터를 요청하고 요청에 대한 응답을 처리할 완료 핸들러를  호출하는 작업을 생성합니다.

  • dataTask(with:) - URLRequest 객체를 기반으로 URL에 데이터를 요청하는 작업 객체를 생성합니다.

  • dataTask(with:completionHandler:) - URLRequest 객체를 기반으로 URL에 데이터를 요청하고 요청에 대한 응답을 처리할 완료 핸들러를 호출하는 작업을 생성합니다.

 

세션에 Download Task 추가하기

  • downloadTask(with:) - URL에 요청한 데이터를 다운로드 받아서 파일에 저장하는 작업을 생성합니다.

  • downloadTask(with:completionHandler:) - URL에 요청한 데이터를 다운로드 받아서 파일에 저장하는 다운로드 작업을 생성하고 저장 완료 후 완료 핸들러를 호출하는 작업을 생성합니다.

  • downloadTask(with:) -  URLRequest 객체를 기반으로 URL에 요청한 데이터를 다운로드 받아서 파일로 저장하는 작업 객체를 생성합니다.

  • downloadTask(with:completionHandler:) - URLRequest 객체를 기반으로 URL에 요청한 데이터를 다운로드 받아서 파일에 저장하는 다운로드 작업을 생성하고 저장 완료 후 완료 핸들러를 호출하는 작업을 생성합니다.

 

세션에 Upload Task 추가하기

  • uploadTask(with:from:) - URLRequest 객체를 기반으로 URL에 데이터를 업로드하는 작업을 생성합니다.

 

  • uploadTask(with:from:completionHandler:) - URLRequest 객체를 기반으로 URL에 데이터를 업로드하고 업로드 완료 후 완료 핸들러를 호출하는 작업을 생성합니다.

 

  • uploadTask(with:fromFile:) : URLRequest 객체를 기반으로 URL에 파일을 업로드하는 업로드 작업을 생성합니다.

 

  • uploadTask(with:fromFile:completionHandler:) : URLRequest 객체를 기반으로 URL에 파일을 업로드하고 업로드 완료 후 완료 핸들러를 호출하는 작업을 만듭니다.

 

Task 상태 제어

  • cancel() - 작업을 취소합니다.
  • resume() - 일시 중단된 경우 작업을 다시 시작합니다.
  • suspended() - 일시적으로 작업을 중단합니다.
  • state : 현재 작업의 상태를 나타냅니다.

  • property - 작업 처리 우선순위를 나타냅니다.  0.0(제일 낮음)부터 1.0(제일 높음)입니다.


Using a Session Delegate

  • 인증 실패했을 때
  • 데이터가 서버로부터 도착했을 때
  • 데이터를 캐싱할 때

세션 객체는 앱이 세션을 종료하거나 명시적으로 세션을 무효화 할 때까지 델리게이트에 대한 강한 참조를 유지한다. 세션을 무효화하지 않으면 앱이 종료될때까지 메모리 릭이 발생된다.

 

Asynchronicity and URL Sessions

URLSession도 다른 네트워킹 API처럼 비동기성이 강하다. 다음 두 가지 방법으로 앱에 데이터를 반환한다.

  • 데이터 전송이 성공적으로 완료되거나 에러가 발생한 경우 완료 핸들러를 호출한다.
  • 데이터 전송이 완료된 경우 세션의 델리게이트 메서드를 호출한다.

 

참고: 

developer.apple.com/documentation/foundation/urlsession

developer.apple.com/documentation/foundation/urlsessiontask

www.boostcourse.org/mo326/lecture/16863/

 

반응형

'iOS' 카테고리의 다른 글

[iOS] Apple 로그인 구현  (2) 2021.02.01
[iOS] NSOperationQueue와 GCD Queue의 차이점  (0) 2021.01.29
[iOS] AppDelegate & SceneDelegate  (0) 2021.01.19
[iOS] App의 Life Cycle  (0) 2021.01.16
[iOS] 시뮬레이터에서 할 수 없는 것들  (0) 2021.01.12

댓글