티스토리 뷰
URLSession -> URLSessionConfiguration을 통해 만들고, 여러개의 URLSessionTask를 만들어 서버와 네트워킹을 진행한다.
(Delegate를 이용해 중간 과정을 볼 수도 있다.)
URLSessionConfiguration을 만드는 과정에서, URL 정책에 따라 Default, Ephemeral, Background형식으로 만들 수 있다.
Default는 기본, Ephemeral은 쿠키나 세션 없이(브라우저의 private mode 등), Background는 다운로드 등에 쓰인다.
URLSessionTask에는 3가지가 있다.
1. URLSessionDataTask : 데이터를 받아올 때 사용한다.
2. URLSessionUploadTask : Background 지원이 안되기 때문에, 업로드 할 때 사용한다.
3. URLSessionDownloadTask : Background 지원이 안되기 때문에, 다운로드 할 때 사용한다.
URL객체를 이용하기
// URL 객체
let urlString = "https://itunes.apple.com/search?media=music&entity=musicVideo&term=Gd"
let url = URL(string: urlString)
// property
url?.absoluteString // 실제주소 : urlString과 똑같이 출력됨
url?.scheme // 프로토콜 : "https"
url?.host // 주 주소 : "itunes.apple.com"
url?.path // : "/search"
url?.query // path에대한 조건 : "media=music&entity=musicVideo&term=Gd"
url?.baseURL // : nil
baseURL을 이용하여 표현하기
// baseURL 설정
let baseURL = URL(string: "https://itunes.apple.com")
let relativeURL = URL(string: "search?media=music&entity=musicVideo&term=Gd", relativeTo: baseURL)
// property
relativeURL?.absoluteString // 실제주소 : baseURL + relativeURL
relativeURL?.scheme // 프로토콜 : "https"
relativeURL?.host // 주 주소 : "itunes.apple.com"
relativeURL?.path // :"/search"
relativeURL?.query // path에대한 조건 : "media=music&entity=musicVideo&term=Gd"
relativeURL?.baseURL // : https://itunes.apple.com
URLComponents를 이용하여 표현하기
// URLComponents - URL정보를 보다 간편하게 관리가능
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: "Gd")
urlComponents?.queryItems?.append(mediaQuery)
urlComponents?.queryItems?.append(entityQuery)
urlComponents?.queryItems?.append(termQuery)
urlComponents?.url // urlComponents?.url?.scheme -> scheme을 가져온다 : https://
urlComponents?.string
urlComponents?.queryItems // urlComponents?.queryItems?.last?.value -> 마지막 value 출력 : Gd
// queryItems로 담으면 한국어도 인코딩이 자동으로 이루어져 서버가 이해할 수 있게 해준다.
< 트랙리스트(서버에서 가져온 데이터)를 오브젝트로 가져오기 >
- Data -> Track 목록으로 가져온다. [Track]
- Track struct를 만들어야 한다.
- Data에서 struct로 파싱해야한다 (Codable을 이용 -> truct의 프로퍼티 이름과 실제 데이터의 키 이름을 맞춘다)
- Json형태의 파일, 데이터를 오브젝트로 만들 때 Codable을 이용한다.
- Response struct를 만들고, 그 안에 트랙이 여러개 있다. -> Response, Track을 만들어야 한다.
- 파싱(Decoding)하여 트랙리스트 를 가져온다,
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
// URL
// URLComponents - URL정보를 보다 간편하게 관리가능
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: "Gd")
urlComponents.queryItems?.append(mediaQuery)
urlComponents.queryItems?.append(entityQuery)
urlComponents.queryItems?.append(termQuery)
let requestURL = urlComponents.url!
// struct
struct Response: Codable {
let resultCount: Int
let tracks: [Track]
enum CodingKeys: String, CodingKey {
case resultCount
case tracks = "results"
}
}
struct Track: Codable {
let title: String
let artistName: String
let thumbnailPath: String
enum CodingKeys: String, CodingKey {
case title = "trackName"
case artistName
case thumbnailPath = "artworkUrl100"
}
}
// dataTask
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 sucessRange = 200..<300 // 200대 범위를 나타냄
guard sucessRange.contains(statusCode) else {
// handle response error
return
}
// 파싱 및 트랙 가져오기
do {
let decoder = JSONDecoder()
let response = try decoder.decode(Response.self, from: resultData)
let tracks = response.tracks
// 첫 번째 트랙의 정보를 가져온다.
print("---> tracks: \(tracks.first?.title), \(tracks.first?.thumbnailPath)")
} catch let error {
print("---> error: \(error.localizedDescription)")
}
}
dataTask.resume()
'iOS' 카테고리의 다른 글
Auto Layout - Anatomy of a Constraint (0) | 2021.06.19 |
---|---|
Table View (0) | 2021.05.23 |
GCD (0) | 2021.01.27 |
Concurrency (0) | 2021.01.27 |
HTTP (0) | 2021.01.27 |