[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 네트워크를 허용할 것인지 같은 접속 동작 정의
- shared Session
- 기본적인 요청에 적합(configuration 객체가 없음)
→ 자유롭게 커스텀할 수 없지만, 아주 제한적인 용도로만 사용 - default Session
- shared Session과 상당히 비슷하게 동작하지만 더 많은 설정 가능
- delegate를 통해 데이터를 점진적으로 받아올 수 있음 - Ephemeral Session
- shared Session과 비슷하지만 캐시나 쿠키, 자격증명을 디스크에 기록하지 않음 - Background session
- 앱이 실행중이지 않을 때도 Background에서 컨텐츠 업로드하거나 다운로드할 수 있게 함
URLSession Task
- Session 내에서 데이터를 선택적으로 업로드하거나 서버로부터 데이터를 불러오는 Task 생성할 수 있음
- Data는 디스크 파일형태, 메모리 상의 NSData 객체 형태일 수도 있음
- Data Task
- NSData 객체를 사용하여 데이터를 전송하고 받음
- 짧고, 잦은 요청을 서버와 주고받는 경우에 사용 - Upload Task
- data task와 비슷
- 주로 파일의 형태로 데이터를 보낼 수 있음
- 앱이 실행중이지 않을 때에도 백그라운드 업로드를 지원 - Download Task
- 파일의 형태로 데이터를 불러옴
- 앱이 실행중이지 않을 때 백그라운드 다운로드와 업로드를 지원
Session Delegate
- 한 Session안에 있는 task들은 공동 delegate를 공유
- 다양한 이벤트(인증 실패, 서버로부터 데이터 도착했을 때, 데이터가 캐시 할 준비가 되었을 때 등)
발생했을 때 정보를 제공하거나 받을 수 있음
- 만약 delegate가 제공하는 기능이 필요없다면 nil 전달
비동기성과 URLSession
- URLSession API는 매우 비동기적임
- 데이터 반환 방식
- 전송이 성공적으로 끝났거나 에러가 발생한 경우 completion handler 블록을 호출
- 데이터가 수신되고 전송이 완료된 후에 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()
출처
'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 |