✅ 자 그럼 이번시간에는 URLSession에 대해서 알아보도록 하자.
✅ URLSessionConfiguration Class에 대해서 보자
대부분은 default로 사용 가능하다.
Ephemeral 같은 경우는 크롬의 시크릿모드 처럼 쿠키나 정보들을 저장하지 않을 때 이용한다.
✅ 다음은 URLSessionTask다
이걸 통해서 실제로 서버와 통신한다.
데이터 받는거면 DataTask를 사용하면 된다. 이건 background 세션에 대한 지원이 안되서 네트워킹을 통해 데이터를 받아오는게 안된다.
나머지 2개는 업로드랑 다운로드에 사용한다.
✅ 그럼 이제 코드리뷰를 몇몇 부분만 한번 봐볼까? (코드에 대한 내용은 이 글의 맨끝에 첨부해 두었어)
⭐️1️⃣ Codable의 사용
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"
}
}
그토록 내가 어려워했던 Codable이야.
Codable은 인코딩과 디코딩을 쉽게해주는데, 주의할점은 변수명이 파일을 내려받는 이름이랑 일치해야한다는 점이야.
하지만 우리가 사용하는 변수명으로 바꾼다면 더욱 좋겠지?
그래서 우리가 채택한 방법인 enum CodingKey ~ 이 부분이야
네트워크를 통해 받아온 변수를 그대로 사용할거면, 그냥 냅두면 되는데, 그렇지 않고 바꾸고 싶은 경우에는 위처럼 대입해서 사용할 수 있어.
그리고 Codable 사용시 생성자를 통해서 init하는 과정이 필요한데, CodingKeys 부분이 이걸 대신해주고 있기도 해!!
참 편리하지?
2️⃣ 다음으로는 파싱하는 부분과 데이터를 가져오는 부분이야
let dataTask = session.dataTask(with: requestURL) { (data, respnse, error) in
guard error == nil else { return } // 에러가 있으면 그냥 끝내기
guard let statusCode = (respnse as? HTTPURLResponse)?.statusCode else { return } // 위키피디아에 들억가면 에러코드에 대한 설명이 나온다.
let successRange = 200..<300 // 200에서 300전까지의 숫자
guard successRange.contains(statusCode) else {
// handle response error
return
}
guard let resultData = data else { return }
let resultString = String(data: resultData, encoding: .utf8)
//print("-->result\(resultData)")
// 목표 : 트랙리스트 오브젝트로 가져오기
// 하고 싶은 작업 목록
// - Data -> Track 목록으로 가져오고 싶다 [Track]
// - Track 오브젝트를 만들어야 겠다
// - Data에서 struct로 파싱하고 싶다 > Codable 이용해서 만들자
// - JSON 파일, 데이터 > 오브젝트 (Codable 이용하겠다)
// - Response, Track 이렇게 두개 만들어야 겠다.
// 해야할 일
// - Response, Track struct
// - struct의 프로퍼티 이름과 실제 데이터의 키와 맞추기 (Codable 디코딩 하기 위해서)
// - 파싱하기 (Decoding)
// - 트랙리스트 가져오기
// 파싱 및 트랙 가져오기
do {
let decoder = JSONDecoder()
let response = try decoder.decode(Response.self, from: resultData) // try는 이 작업이 항상 성공한다는 보장이 없다는 말. 실패시 catch로 이동 -> 리절트 데이터를 리스폰스.self로 디코딩한다.
let tracks = response.tracks
print("--> tracks : \(tracks.count)")
} catch let error {
print("--> error : \(error.localizedDescription)")
}
}
dataTask.resume()
서버에서 내려오는 데이터가 에러가 날 수 있는 상황을 가정해서 guard문으로 보호하고, 에러 처리 후 가져오면 ㅍ돼
try 구문도 작업이 항상 성공한다는 보장은 없으니까 꼭 사용하길 바래 그 경우 catch로 이동해서 핸들링하게
디코딩 하는 코드는 쭉 보면 쉽게 이해되니까 천천히 살펴보고
구체적인건 깃허브 방문해서 알아보도록 하자
https://github.com/lgvv/fastCampus/tree/main/URLSession.playground
실습을 보면 간단하게 이해되니 찾아보기!!
(추가)
✅ 그럼 실제로 서치바를 이용해서 텍스트를 입력한 뒤 네트워크를 통해 받아오는 과정을 알아보자!
'Archive > 패캠(올인원)' 카테고리의 다른 글
ch15 escaping과 non-escaping 클로저에 대해서 알아보자 (0) | 2021.06.29 |
---|---|
🍜 ch15 인스턴스 메소드 vs 타입메소드 (0) | 2021.06.29 |
📡 ch14 Networking (0) | 2021.06.28 |
ch13 Todo 리스트 코드리뷰 (0) | 2021.06.26 |
⌨️ ch13 키보드에 따른 레이아웃 조정하기 (0) | 2021.06.26 |