새소식

iOS/Swift

[Swift] URLSession

  • -

URLSession


- URL이 가리키는 EndPoint로 Data를 다운받거나 업로드하기 위한 API 제공

- 앱이 실행하지 않고 있거나, 앱이 일시정지 상태 일때도 백그라운드 다운로드를 수행할 수 있도록 해줌

- 하나 이상의 Session을 만들고 각 Session은 관련 데이터 전송 작업 그룹을 조절

- 기본적으로 사용자의 시스템 환경 설정에 구성된 프록시 서버 및 SOCKS 게이트웨이에 대한 투명한 지원을 통해 데이터, 파일, FTP, HTTP 및 HTTPS URL 스키마를 지원

- 또한 HTTP/1.1, SPDY, HTTP/2 프로토콜을 지원

→ ALPN이나 NPN 둘 중 하나 지원하는 서버를 필요로 함

 

 

URLSession Configuration


- 하나의 URLSession에 속한 task들은 session configuration 객체를 공유

→ 호스트당 생성 가능한 동시 접속갯수나 celluar 네트워크를 허용할 것인지 같은 접속 동작 정의

 

  1. shared Session 
    - 기본적인 요청에 적합(configuration 객체가 없음)
    → 자유롭게 커스텀할 수 없지만, 아주 제한적인 용도로만 사용

  2. default Session 
    - shared Session과 상당히 비슷하게 동작하지만 더 많은 설정 가능
    - delegate를 통해 데이터를 점진적으로 받아올 수 있음

  3. Ephemeral Session 
    - shared Session과 비슷하지만 캐시나 쿠키, 자격증명을 디스크에 기록하지 않음

  4. Background session
    - 앱이 실행중이지 않을 때도 Background에서 컨텐츠 업로드하거나 다운로드할 수 있게 함

 

 

URLSession Task


- Session 내에서 데이터를 선택적으로 업로드하거나 서버로부터 데이터를 불러오는 Task 생성할 수 있음

- Data는 디스크 파일형태, 메모리 상의 NSData 객체 형태일 수도 있음

 

  1. Data Task
    - NSData 객체를 사용하여 데이터를 전송하고 받음
    - 짧고, 잦은 요청을 서버와 주고받는 경우에 사용

  2. Upload Task
    - data task와 비슷
    - 주로 파일의 형태로 데이터를 보낼 수 있음
    - 앱이 실행중이지 않을 때에도 백그라운드 업로드를 지원

  3. Download Task
    - 파일의 형태로 데이터를 불러옴
    - 앱이 실행중이지 않을 때 백그라운드 다운로드와 업로드를 지원

 

 

 

Session Delegate


- 한 Session안에 있는 task들은 공동 delegate를 공유

- 다양한 이벤트(인증 실패, 서버로부터 데이터 도착했을 때, 데이터가 캐시 할 준비가 되었을 때 등)
발생했을 때 정보를 제공하거나 받을 수 있음

- 만약 delegate가 제공하는 기능이 필요없다면 nil 전달

 

 

비동기성과 URLSession


- URLSession API는 매우 비동기적임

- 데이터 반환 방식

  1. 전송이 성공적으로 끝났거나 에러가 발생한 경우 completion handler 블록을 호출
  2. 데이터가 수신되고 전송이 완료된 후에 delegate가 메서드를 호출

 

 

Example


  let urlComponents = URLComponents(string: addressURL)
    let requsestURL = urlComponents?.url!

    let session = URLSession(configuration: URLSessionConfiguration.default, delegate: self, delegateQueue: OperationQueue.current)

    let dataTask = session.dataTask(with: requsestURL!){ data, response, error in
            
        let successRange = 200..<300
        guard error == nil, let statusCode = (response as? HTTPURLResponse)?.statusCode, successRange.contains(statusCode) else{
            return
        }
           
        guard let resultData = data else{
            return
        }

        let resultString = String(data: resultData, encoding: .utf8)
        print(resultString!)

    }.resume()

 

 

https://github.com/kimkhuna/ExchangeRateCalculator/blob/main/ExchangeRateCalculator/Services/WebService.swift

 

GitHub - kimkhuna/ExchangeRateCalculator

Contribute to kimkhuna/ExchangeRateCalculator development by creating an account on GitHub.

github.com

 

 

 

출처

 

URLSession - 사과

func downloadTask(with: URLRequest, completionHandler: (URL?, URLResponse?, Error?) -> Void) -> URLSessionDownloadTask 특정 URLRequest 객체를 기반으로 컨텐츠를 불러와서 파일로 저장하고, 완료 후에 handler를 호출하는 download

melod-it.gitbook.io

 

 

 

728x90

'iOS > Swift' 카테고리의 다른 글

[Swift] URLComponent  (0) 2022.11.20
[Swift] URLSession https 인증서 신뢰  (0) 2022.11.20
[Swift] Codable vs JSONSerialization  (1) 2022.10.15
[Swift] 접근제어  (0) 2022.09.28
[Swift] 인스턴스  (0) 2022.09.28
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.