URLSession
- 네트워크 데이터 전송 작업을 조정하는 객체
- HTTP 프로토콜을 사용하여 앱 - 서버간 데이터를 통신을 위해 애플이 제공하는 API
- 앱은 하나 이상의 URLSession 인스턴스를 생성하여 각자 데이터 전송 작업 그룹을 담당
- HTTP 포함한 프로토콜 몇가지 지원
- 인증, 쿠키 관리, 캐시 관리 등을 지원
- request, response 구조를 갖음
- Configuration 결정 → Session 생성 → Request용 URL 설정 → Task 결정 및 작성
URLSessionConfiguration
- shared session : 기본 요청에 대한 공통 session 구성 객체
- customizable session과 달리 사용자 정의 불가능
- 간단하게 사용 가능하지만 delegate, configuration을 제공하지 않기 때문에 제약이 있음
- 점진적 데이터 수신 불가능, 인증이 있는 경우 사용 불가능, background 사용 불가능
- customizable session : Default, Ephemeral, Background 세가지 형태로 URLSession을 생성(configure)
- Default : 기본 통신. 캐싱을 지원. shared Session과 유사하지만 사용자가 구성 가능.
- → 캐싱이란, 파일 복사본을 캐시나 임시 저장 위치에 저장하여 빠르게 액세스하도록 하는 프로세스
- Ephemeral : 쿠키나 캐시를 저장하지 않는 정책을 가져올 때 사용 ex. Safari 개인정보보호 모드
- Background : 앱이 백그라운드에 있는 상황에서 컨텐츠 다운로드, 업로드에 사용. 앱 종료되도 통신을 지원하는 세션
Delegate
- URLSession은 Delegate가 필수적이지 않음 → Delegate를 지정하지 않으면 시스템 제공 Delegate를 사용
- 특정 Task에 별도의 delegate를 지정하여 SessionDelegate에 도달하기 전에 콜백을 가로챌 수 있음
- 아래 경우를 포함한 다양한 이벤트 발생 시 정보를 제공하고 얻을 때 사용
- 인증 실패
- 서버로부터 데이터 수신
- 데이터를 캐싱이 가능하게 함
- 위 기능이 필요하지 않으면 Session을 생성할 때 Delegate를 nil
- Session은 앱이 종료되거나 Session을 무효화할 때까지 Delegate를 강한 참조
- → Session을 무효화하지 않으면 메모리 leak 발생
- 인증을 지원, 리디렉션(304: 내가 누른 주소가 아닌 다른 주소로 옮겨짐), 작업 완료와 같은 이벤트를 수신
- URLSessionDelegate가 task 수준의 이벤트를 처리하기 위해 사용하는 프로토콜
- 콜백을 제공하거나 async-await 메소드를 사용하여 데이터를 가져옴
- 데이터 테스크, 다운로드 테스크는 받아오는 사이즈에 따라 URLSessionDownloadDelegate사용
- 아래 경우를 포함한 다양한 이벤트 발생 시 정보를 제공하고 얻을 때 사용
- URLSessionDelegate
URL Query
예제) https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=바나나
- https://search.naver.com/search.naver : URL 주소
- where=nexearch : URLQueryItem 형태 - key(name)=value
- search.naver : 엔드포인트 - 쿼리가 발생하기 전까지가 엔드 포인트
- & : 여러 query를 구분
URLSession Task
- DataTask
- Response Data를 받아서 메모리 상에 처리
- Background Session 지원 X
- Task 실행 (→ URL 요청을 실시하고 완료) → 핸들러 실행 : 핸들러는 escaping Closure 형태로 받아져야함
- UploadTask
- 파일 업로드 시 사용
- background 업로드도 지원한다
- DownloadTask
- 파일 다운로드하여 디스크에 쓸 때 사용
- background 다운로드도 지원한다
- WebSocket Task
- RFC 6455에 정의된 WebSocket 프로토콜을 사용하여 TCP 및 TLS를 통해 메시지를 교환
MDN - HTTP response status codes
- Successful responses (200 – 299) → 이것을 베이스로 successRange를 설정
Asynchronicity and URL Sessions
- 앱에 데이터를 비동기적으로 반환하는 방법
- 데이터 전송이 완료될 때 completion handler를 실행시킬 수 있음
- 데이터 전송 중 혹은 완료 직후에는 Delegate 메소드를 사용하여 콜백을 받을 수 있음
- 또한 URLSession은 상태와 진행 프로퍼티를 제공하여, 이 프로퍼티에 따라 프로그래밍 방식을 결정해야하는 경우에 사용함. 단, 해당 상태가 가변될 수 있다는 경고를 포함
- → 데이터 송신의 상태에 따른 프로그래밍이 가능
Completion Handler
func a() {
getFetchData { banana in print ("a: \\ (banana)")
}
}
//네트워크를 통해 네이버에서 바나나 정보를 가져옴
func getFetchData (handler: (Banana) -> Void) {
dataTask({ banana in handler (banana)
})
}
func dataTask(handler: (Banana) -> Void) {
URLSession.shared. () ... {
// 성공
handler ( )
}
}
참고 링크
URLSession | Apple Developer Documentation
728x90
'TIL' 카테고리의 다른 글
MarkDown 접기 (0) | 2023.12.11 |
---|---|
SOLID (0) | 2023.12.01 |
estimatedItemSize / itemSize (0) | 2023.11.30 |
UIApplicationDelegate / UISceneDelegate (0) | 2023.11.24 |
View 갈아끼우기 (0) | 2023.11.23 |