URLSession
- Session과 Task를 용도에 맞춰서 조합해 사용을 한다.
URLSession.shared.dataTask()
URLSession(configuration: .default).downloadTask()
...
Session
- 단일 host에 가능한 최대연결개수, cellular 사용가능여부, 등과 같은 연결에 대한 정의를 하는 객체이다.
- 종류
- Shared → Configuration이 존재하지 않아, 기본적이고 간단한 요청에 적합하다.
- Defualt → Shared와 비슷하지만, Configuration이 존재한다. Data를 축적해나가며 수신하는 delegate와 같은 동작을 구현할 수 있다.
- Ephemeral → 역시 Shared와 비슷하지만, cache, cookies, credential등을 디스크에 저장하지 않는다. Safari Private Tab과 비슷하다고 생각하면 편하다.
- Background → App이 동작하지 않을 때, upload, download를 수행할 수 있도록 해준다.
Task
- Session안에서, 용도에 따른 여러가지 Task가 사용된다.
- suspended 상태로 시작하기 때문에,
resume()
을 호출해야 통신이 시작된다.
- 종류
- DataTask → NSData 객체를 보내고, 받는다. 짧고 빈번한 요구를 할 때 사용된다.
- DownloadTask → DataTask와 비슷하지만, App이 동작하지 않을 때 Background에서 다운로드 가능하다.
- UploadTask → DownloadTask와 마찬가지로, Background에서 업로드 가능하다.
- WebSocketTask → RFC 6455에서 정의된 WebSocket 프로토콜을 사용해 TCP, TLS 통신을 수행한다.
URLRequest
- 연결 하려는 URL, 연결에 대한 policy(연결 방법, 헤더, cache policy 등..) 두가지의 정보를 포함하고 있다.
- Request에 대한 정보만 갖고있기 때문에 다른 API들과 함께 사용해야 한다.
URLResponse
- Request에 대한 응답과 관련된 메타데이터이다.
- 앞서 나온 Session, Task의 종류에 관계가 없는 독립적인 클래스다.
- Completion Handler를 통해서 응답 처리
- Task가 종료된 시점에 한 번만 호출이 된다
- Delegate로 응답 처리
- 통신 중에 여러가지 상황에 대응하기 위해서 사용
- 서버로부터 최초 응답, 데이터를 받을 때 마다, 전송이 완료됬을 때 등 여러상황에 대해 이벤트를 처리할 수 있다.
- 예) 30개의 Task를 수행해던 중에 끊기면, 다음에 연결됐을 때 다시 끊긴부분부터 실행하는 등.
- 주의) UI에 대한 처리는 모두 메인 쓰레드에서 동작하게 해야 한다.
DispatchQueue.main.async {
tableView.reloadData()
}