์ค๋์ ์ด๋ฐ ์ํ ์ ๋ณด ์ถ๋ ฅ ์ฑ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ฐฐ์ ๋ค.
์ด์ ์ ์๋๋ก์ด๋ ์ฑ์ ๋ง๋ค ๋๋ ์น์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๋๋ ๋ง์ด ์ฌ์ฉํ๋
http request๋ฅผ ๋ณด๋ด์ response๋ฅผ ๋ฐ์์ parsingํ์ฌ
์ํ๋ ์ ๋ณด๋ง์ ๋นผ๋ด์์ Model์ ์ ์ฅํ๊ณ , ํ๋ฉด์ ๋ฟ๋ ค์ฃผ๋ ๋ก์ง์ด๋ค.
์ ํ์ ๋ญ๊ฐ ์ด๋ฐ ๊ณต๊ณต api๋ฅผ ์ด์ฉํ๋๊ฒ ๋ ์ฌ์๋ณด์๋ค.
์ค๋ ํ ๋ถ๋ถ์ ์์๋๋ก ์ ๋ฆฌํ์๋ฉด
1. ํ๋ฉด ๊ตฌ์ฑํ๊ธฐ(ํ ์ด๋ธ๋ทฐ, ๋ทฐ ์ )
2. ๋ชจ๋ธ ๋ง๋ค๊ธฐ
3. ๋คํธ์ํฌ ํธ์ถ ๋ฐ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
4. ํ๋ฉด์ ๋ฟ๋ ค์ฃผ๊ธฐ
1. ํ๋ฉด ๊ตฌ์ฑํ๊ธฐ
๋ ์ด์์์ ์ด๋ ๊ฒ ์๊ฒผ๋ค.
๋จผ์ ํ ์ด๋ธ ๋ทฐ๋ฅผ ์์ฑํ๊ณ ๊ทธ ์์ ํ ์ด๋ธ ๋ทฐ ์ ์ ๋ง๋ ๋ค.
ํ ์ด๋ธ ๋ทฐ ์ ์
๋ ์ด๋ธ 4๊ฐ์ ์ด๋ฏธ์ง ๋ทฐ 1๊ฐ๋ก ๊ตฌ์ฑ๋์ด์๋ค.
์ด ๊ณผ์ ์์ ์คํ ๋ ์ด์์ ์ค์ ์ค์
Content Hugging Priority๋ฅผ ๋ง์ง๋ ๋ถ๋ถ์ด ์์๋๋ฐ
๊ฑฐ๊ธฐ์ ๋ญ ์๋ชปํ๊ฑด์ง ์๋์ง
ํ์ดํ์ด ์๋์๊ฐ ์ข ์งค๋ ค์ ๋์ค๊ฒ ๋์๋๋ฐ ์ด๊ฑด ์ฐจ์ฐจ ๊ณ ์ณ์ผ๊ฒ ๋ค.
2. ๋ชจ๋ธ ๋ง๋ค๊ธฐ
api๋ก ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ค์์ ์ํ๋ ์ ๋ณด๋ฅผ ๋นผ์์ ์ ์ฅํ๊ธฐ ์ํ ๋ชจ๋ธ์ ๋ง๋ ๋ค.
์ฌ๊ธฐ์ JSON ํ์์ผ๋ก ๋ฐํ๋๋ response ํ์ผ์์ ํ์ํ ์ ๋ณด๊ฐ ์ด๋ค ์ด๋ฆ์ผ๋ก ๋์ด์๋์ง๋ฅผ ๋ณด๊ณ
๊ทธ ์ด๋ฆ์ด๋ ๋๊ฐ์ด ํ๋ฉด๋๋ค. ๊ทธ๋ผ ๋ณ๋ค๋ฅธ ์ฝ๋๋ฅผ ์ถ๊ฐํ์ง ์์๋ ์ด์ฉํ ์ ์๊ฒ ๋๋ค.
import Foundation
struct MovieModel: Codable {
let resultCount: Int
let results: [Result]
}
struct Result: Codable {
let trackName: String?
let previewUrl: String?
let thumbnail: String?
let shortDescription: String?
let longDescription: String?
let currency: String?
let trackPrice: Double?
enum CodingKeys: String, CodingKey {
case thumbnail = "artworkUrl100"
case trackName
case previewUrl
case shortDescription
case longDescription
case currency
case trackPrice
}
}
๊ทธ๋์ ์ด๋ฐ์์ผ๋ก ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค.
์ฌ๊ธฐ์ ๋ง์ฝ JSONํ์ผ์ ์๋ ์ด๋ฆ์ผ๋ก ์ํ๊ณ ์์๋ก ์ง์ ํ๊ฒ ๋ค ํ๋ฉด
๋ฐ์ CodingKeys๋ผ๋ enum์ ์ ์ธํด์ค์ผ ํ๋ค.
์ด๋ฆ์ ๋ฐ๊ฟ์ ์ฌ์ฉํ ๋ฐ์ดํฐ ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๊ฒ๋ค๋ ๋ค ์ ์ด์ค์ผ ์ค๋ฅ๊ฐ ์๋๋ค.
3. ๋คํธ์ํฌ ํธ์ถ ๋ฐ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ด๋ค.
๋จผ์ requestMovieAPI๋ผ๋ ์ด๋ฆ์ผ๋ก ํจ์๋ฅผ ํ๋ ๋ง๋ค์๋ค.
func requestMovieAPI(){
let sessionConfig = URLSessionConfiguration.default
let session = URLSession(configuration: sessionConfig)
var components = URLComponents(string: "https://itunes.apple.com/search")
let term = URLQueryItem(name: "term", value: "marvel")
let media = URLQueryItem(name: "media", value: "movie")
components?.queryItems = [term, media]
guard let url = components?.url else{
return
}
์ธ์ ์ ๋ง๋ค๋ ์ฌ์ฉํ sessionConfig๋ฅผ ์์ฑํ๊ณ , ์ธ์ ์ ๊ทธ configuration์ ์ฌ์ฉํ์ฌ ์์ฑํ๋ค.
๊ทธ๋ฆฌ๊ณ URLComponents๋ก url๋ฅผ ์ค์ ํด์ฃผ๋๋ฐ,
๊ทธ ๋ค์ GET์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ผ ๋ ํ์ํ ๊ฐ๋ค์ ์ค์ ํด์ฃผ๊ณ ,
components?.queryItems = [term, media] ๋ก url ์ปดํฌ๋ํธ ์ค์ ์ ํด์ค๋ค์, url์ ์์ฑํ๋ค.
Apple์ API์ฌ์ฉ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ์.
http://resources.organicfruitapps.com/documentation/itunes-store-web-service-search-api/
var request = URLRequest(url: url)
request.httpMethod = "GET"
๊ทธ๋ฆฌ๊ณ ์์ฑํ url์ ์ฌ์ฉํ์ฌ request๋ฅผ ์์ฑํ๊ณ GET๋ฐฉ์์ผ๋ก ์ค์ ํ์ฌ request๋ฅผ ๋ณด๋ธ๋ค.
let task = session.dataTask(with: request) { data, response, error in
print((response as! HTTPURLResponse).statusCode)
if let hasData = data {
do {
self.movieModel = try JSONDecoder().decode(MovieModel.self, from: hasData)
print(self.movieModel ?? "no data")
DispatchQueue.main.async {
self.movieTableView.reloadData()
}
}catch{
print(error)
}
}
}
๊ทธ๋ฆฌ๊ณ session.dataTask๋ฅผ request๋ฅผ ํตํด ์คํํ๋ฉด
data, response, error ์ด๋ ๊ฒ ์ธ๊ฐ์ง๋ฅผ ๋ฐํํด์ฃผ๊ฒ ๋๋ค.
๊ทธ๊ฑธ ์ด์ฉํด์ HttpStatus code๋ฅผ ๋ถ๋ฌ์์ ์ฝ์์ ์ถ๋ ฅํด๋ณด๊ณ ,
data๋ฅผ JSONDecoder๋ฅผ ์ฌ์ฉํด์ ํ์ฑํ๋ค์ movieModel์ ์ ์ฅํ๋ค.
์ด ๋ชจ๋ ๊ณผ์ ์ main thread๊ฐ ์๋ ๊ณณ์์ ์คํ๋๊ณ ์์ผ๋ฏ๋ก
movieTable์ ๋ค์ reloadํ๋ ๊ณผ์ ์ main์์ ์คํ๋๋๋ก DispatchQueue ํด์ค๋ค.
task.resume()
session.finishTasksAndInvalidate()
task๋ฅผ resume์ผ๋ก ์คํํ๊ณ , session์ ๋ซ๋๋ค.
4. ํ๋ฉด์ ๋ฟ๋ ค์ฃผ๊ธฐ
ํ๋ฉด์ ๋ฟ๋ฆฌ๋ ๊ฒ์ ์์์ ์ฌ๋ฌ๋ฒ ํ๋ ๊ฒ๊ณผ ๊ฐ์ด table view์ delegate, datasource ํจ์๋ค์ ๊ตฌํํด์ฃผ๋ฉด์
ํ ์ ์๋ค.
extension ViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.movieModel?.results.count ?? 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MovieCell", for: indexPath) as! MovieCell
cell.titleLabel.text = self.movieModel?.results[indexPath.row].trackName ?? ""
cell.descriptionLabel.text =
self.movieModel?.results[indexPath.row].shortDescription ?? ""
let currency = self.movieModel?.results[indexPath.row].currency ?? ""
let price = self.movieModel?.results[indexPath.row].trackPrice?.description ?? ""
cell.priceLabel.text = currency + " " + price
return cell
}
}
๋ฌธ์ ๋ ๊ฐ์ด ์์ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ๋ณ์๋ค์ด ์ต์ ๋์ด๋ผ ๊ทธ๊ฑฐ ์ฒ๋ฆฌ๋ฅผ ์ ํด์ค์ผ ํ๋ค.
์ด์ ๋ค์์๋ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๊ฒ์์ด๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ค์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ํ ์์ ์ด๋ค.
'๐ก work work work > swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
swift ์ค์ต - 7 : To-do App (0) | 2022.03.03 |
---|---|
swift ์ค์ต - 6.2 : Movie App ๋ง๋ฌด๋ฆฌ (0) | 2022.03.02 |
swift ์ค์ต - 5 : Photo Gallery App (0) | 2022.02.22 |
swift ์ค์ต - 4 : OnBoardingView (0) | 2022.02.21 |
swift ์ค์ต - 3.2 : Setting App Clone (0) | 2022.02.15 |
๋๊ธ