본문 바로가기
iOS/설명

[iOS] URLSession

by Sky Titan 2022. 5. 16.
728x90
 

Apple Developer Documentation

 

developer.apple.com

URLSession

  • URLSession은 네트워크 데이터 전송과 관련된 태스크를 처리하는 오브젝트이다.
    • 명시된 URL을 통해 데이터를 다운로드, 혹은 업로드하는 API를 제공한다.
    • 또한 백그라운드 상황, 즉 앱이 suspended되어있거나 하는 상황에서 background download를 할 수 있도록 API를 제공한다.
  • URLSessionDelegate, URLSessionTaskDelegate을 이용하여 인증을 지원하거나, redirection, task completion과 같은 작업을 처리할 수 있다.
  • App은 여러 개의 URLSession 인스턴스를 생성해서 관련된 여러 개의 data-transfer 태스크들을 처리한다.
  • Thread-safety 하다.

 

SessionDelegate 사용

  • 아래와 같은 이벤트들을 수신, 처리할 수 있다.
    • 인증 실패
    • 서버에서 온 데이터
    • 데이터를 캐싱을 위해 사용할 수 있게함

 

URLSession Task의 종류

  • Data Task
    • NSData를 이용해서 data를 송수신한다.
    • 짧고, 활발한 서버 request들을 위해 사용된다.
  • Upload Task
    • data task와 유사하지만 file 형식의 data업로드를 지원한다.
    • app이 실행되지 않을 때에도 background upload를 지원한다.
  • Download Task
    • file 형식의 data를 다운로드 할 수 있다.
    • background upload, download를 지원한다.
  • Websocket Task
    • RFC6455에 정의된 웹소켓 프로토콜을 이용하여 TCP, TLS를 이용하여 메세지를 교환한다.

 

 

App Transport Security (ATS)

  • iOS9.0 이상부터는 URLSession을 통해 만든 HTTP연결에는 ATS를 사용하는데, 이는 HTTP 연결에 무조건 HTTPS가 필요하게 된다.

 

예제1 - dataTask로 이미지 불러오기

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
     
        setImageView()
    }
    
    func setImageView() {
        if let url = URL(string: "https://cdn.pixabay.com/photo/2021/05/24/19/34/girl-6280358_960_720.jpg") {
            let request = URLRequest(url: url, cachePolicy: .returnCacheDataElseLoad, timeoutInterval: 5)
            
            let task = URLSession.shared.dataTask(with: request, completionHandler: { [weak self] data, response, error in
                DispatchQueue.main.async {
                    if let error = error {
                        print(error.localizedDescription)
                        return
                    }
                    
                    if let data = data {
                        let image = UIImage(data: data, scale: UIScreen.main.scale) // scale factor 지정
                        self?.imageView.image = image
                    }
                }
                
                
            })
            task.resume()
        }
    }
}

이미지 불러오기 결과

 

예제2 - JSON 응답 받아오기

import UIKit
import Foundation


if let url = URL(string: "https://reqres.in/api/users/2") {
    let request = URLRequest(url: url, cachePolicy: .returnCacheDataElseLoad, timeoutInterval: 5)
    
    let task = URLSession.shared.dataTask(with: request, completionHandler: { data, response, error in
        DispatchQueue.main.async {
            if let error = error {
                print(error.localizedDescription)
                return
            }
            
            if let data = data, let testResponse = try? JSONDecoder().decode(TestResponse.self, from: data) {
                print(testResponse.data)
            }
        }
        
        
    })
    task.resume()
}

struct TestResponse: Codable {
    let data: TestData
    let support: TestSupport
    
    struct TestData: Codable {
        let id: Int
        let email: String
        let first_name: String
        let last_name: String
        let avatar: String
    }
    
    struct TestSupport: Codable {
        let url: String
        let text: String
    }
}

/* 결과
TestData(id: 2, email: "janet.weaver@reqres.in", first_name: "Janet", last_name: "Weaver", avatar: "https://reqres.in/img/faces/2-image.jpg")

*/
728x90

'iOS > 설명' 카테고리의 다른 글

[iOS] UIView와 CALayer의 차이  (0) 2022.05.21
[iOS] Rest API 테스트 사이트  (0) 2022.05.21
[iOS] UIViewPropertyAnimator  (0) 2022.05.15
[iOS] Push Notification callback함수들  (1) 2022.04.24
[iOS] UIView.transition  (0) 2022.04.24

댓글