let task = session.dataTask(with: url) { (data, response, error) in
if let error = error {
// 통신 중 에러가 발생한 경우 에러 처리
return
}
guard let httpResponse = response as? HTTPURLResponse else {
// HTTPURLResponse로 변환할 수 없는 경우 에러 처리
return
}
guard (200...299).contains(httpResponse.statusCode) else {
// 상태코드가 성공이 아닐 경우 에러 처리
return
}
guard let data = data else {
// 데이터가 nil일 경우 에러 처리
return
}
do {
let decoder = JSONDecoder()
// 디코딩 및 데이터 활용 처리
} catch {
// 디코딩이 성공적으로 수행되지 않았을 경우 에러처리
}
}
URL을 전달하여 Task를 생성합니다.
URL이 아닌 URLRequest를 전달할 수도 있는데, 이는 Task 별로 네트워크 설정(캐시 정책 등)을 변경하고 싶을 때 사용합니다.
completion handler는 URL을 통해 네트워크 작업이 완료되면 호출됩니다. 이를 통해 data, response, error값을 전달받을 수 있습니다.
data : 서버에서 전달된 Binary Data
response : 서버 응답에 대한 정보
error : 에러 발생시 에러 정보
이들을 활용해 data를 decoding하고 이를 활용합니다.
아직은 task가 suspended 상태입니다.
task.resume()
task를 실행합니다. (끝)
Session Configuration
Session Configuration을 통해 네트워크 연결과 관련된 속성을 설정할 수 있습니다.
셀룰러 연결 금지, 캐시 저장위치 설정, 쿠기 설정 변경, 타임아웃 값 설정 등을 수행할 수 있습니다.
URLSession을 생성하기 전에 미리 구성을 완료한 뒤, URLSession 생성자로 전달해 사용할 수 있습니다.
URLSession이 생성된 후에는 Session Configuration을 수정할 수 없습니다. (Read Only)
기본적으로 제공하는 Session Configuration은 총 4가지입니다.
Shared : shared session에서 사용되는 Configuration으로, 일반적으로 직접 사용하는 경우는 없습니다.
Default : 기본 Configuration 설정을 기반으로 구성되어 있습니다. delegate를 통한 이벤트 처리 제공하며 disk 캐싱으로 서버 전달 데이터를 전달합니다.
Ephemeral : Default와 유사하지만 메모리에만 캐싱을 처리한다는 특징이 있습니다.
Background : Download 및 Upload Task에서 활용합니다. 앱 실행상태와 관계없이 데이터를 전송할 수 있도록 합니다.
let configurationDefault = URLSessionConfiguration.default
let configurationEphemeral = URLSessionConfiguration.ephemeral
let sessionWithDefault = URLSession(configuration: configurationDefault)
let sessionWithEphemeral = URLSession(configuration: configurationEphemeral)
이와 같은 방식으로 Configuration을 생성하고 활용합니다.
let configurationBackground = URLSessionConfiguration.background(withIdentifier: "DownTask")
let sessionWithBackground = URLSession(configuration: configurationBackground)
background Configuration에서는 Identifier 및 Delegate를 필요로 합니다.
이 부분은 나중에 다시 공부해서 포스팅하겠습니다!
let configurationCustom = URLSessionConfiguration.default
configurationCustom.timeoutIntervalForRequest = 30
configurationCustom.httpAdditionalHeaders = ["API-VERSION": "2.0.0"]
let sessionWithCustom = URLSession(configuration: configurationCustom)
이렇게 생성된 URLSessionConfiguration은 자유롭게 수정이 가능합니다.
timeout 시간을 설정하는 timeoutIntervalForRequest,
모든 task에 추가 헤더를 설정해주는 httpAdditionalHeaders 등 다양한 프로퍼티가 존재합니다.