앱이 서버에서 애플리케이션 데이터를 검색하거나, 소셜미디어 상태를 업데이트하거나 원격 저장소 파일을 디스크로 다운로드하는 등, 모바일 애플리케이션의 중심에 있는 HTTP 네트워크 요청은 마법을 일으킵니다. 네트워크 요청에 대한 수많은 요구사항을 지원하기 위해 애플은 HTTP를 통해 콘텐츠를 다운로드, 업로드하기 위한 완성된 네트워킹 API인 URLSession을 제공 합니다.
URLSession은 HTTP 요청의 송신과 수신을 담당하는 핵심 객체입니다. 다음 3가지 타입으로 제공되는 URLSessionConfiguration을 사용해서 생성합니다.
* URLSessionConfiguration
- .default: 디스크 지속(disk-persisted) 전역 캐시, 자격 증명(credential)과 쿠기 저장 객체를 사용하는 기본 구성 객체(default configuration object)를 생성합니다.
- .ephemeral: 모든 세션 관련 데이터가 메모리에 저장된다는 점을 제외하고는 기본 구성(default configuration)과 다릅니다. 비공개(private) 세션이라고 생각하세요.
- .background: 세션은 업로드와 다운로드를 백그라운드에서 이행합니다. 앱 그 자체가 일시중지(suspended) 되거나 시스템에 의해 종료되는(terminated by the system) 경우에도 전송이 계속됩니다.
URLSessionTask는 작업 객체를 나타내는(denotes) 추상 클래스입니다. 세션은 데이터를 가져오고 파일을 다운로드하거나 업로드하는 실제 작업을 수행하는 하나 이상의 작업을 만듭니다.
다음은 3가지 유형의 구체적인 세션 작업입니다.
- URLSessionDataTask: 서버에서 메모리로 데이터를 검색하는 HTTP GET 요청에 대한 작업으로 사용합니다.
- URLSessionUploadTask : 전통적인 HTTP POST 또는 PUT 메소드를 사용해서 웹서비스에 디스크의 파일을 업로드하는 작업에 사용합니다.
작업을 일시정지, 재개, 취소할 수 있습니다. URLSessionDownloadTask는 향후 재개를 위해 일시 중지할 수 있는 추가 기능이 있습니다.
일반적으로, URLSession은 두 가지 방법으로 데이터를 반환합니다: 작업이 완료될 때 완료 핸들러(completion handler)를 통하거나 또는 세션을 생성할 때 설정한 델리게이터(delegate)에서 메소드를 호출해서 성공이나 오류가 발생합니다.
위 글은 까칠코더님의 블로그 글의 일부를 발췌한 내용입니다.
출처: https://kka7.tistory.com/95 [때로는 까칠하게..]
<수업 실습코드>
[전체코드]
import UIKit
// URLSession
// 1. URLSessionConfiguration
// 2. URLSession
// 3. URLSessionTask를 이용하여 서버와 네트워킹
// URLSessionTask
// - dataTask
// - uploadTask
// - downloadTask
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
// URLComponents
var urlComponents = URLComponents(string: "https://itunes.apple.com/search?")!
let mediaQuery = URLQueryItem(name: "media", value: "music")
let entityQuery = URLQueryItem(name: "entity", value: "song")
let termQuery = URLQueryItem(name: "term", value: "지드래곤")
// urlCompnents에 파라미터 Query 할당
urlComponents.queryItems?.append(mediaQuery)
urlComponents.queryItems?.append(entityQuery)
urlComponents.queryItems?.append(termQuery)
let requestURL = urlComponents.url!
let dataTask = session.dataTask(with: requestURL) { (data, response, error) in
guard error == nil else { return }
guard let statusCode = (response as? HTTPURLResponse)?.statusCode else { return }
let successRange = 200..<300
guard successRange.contains(statusCode) else {
// handle error response
return
}
guard let resultData = data else { return }
let resultString = String(data: resultData, encoding: .utf8)
print("---> resultData : \(resultData)")
print("---> result : \(resultString)")
}
dataTask.resume()
'iOS' 카테고리의 다른 글
[28일차] SearchBar와 키보드 숨김 처리 (0) | 2020.08.22 |
---|---|
[27일차] Codable 이란? (0) | 2020.08.19 |
[25일차] Concurrency 동시성 (sync/Async) (0) | 2020.08.15 |
[24일차] Network 통신 (0) | 2020.08.14 |
[23일차] TodoList 추가/삭제 (0) | 2020.08.12 |
댓글