728x90
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 |
댓글