✅ TMDB 사이트 방문
✅ TMDB 사이트에서 API를 호출하는 함수 구현
✅ 함수로 불러온 정보를 토대로 데이터모델 구축
✅ TMDB 사이트 방문
- 회원가입 후 개인 설정 -> API 부분의 값 확인
- Managers 폴더 내에 APICaller 이라는 이름의 swift 파일 생성
import Foundation
struct Constants {
static let API_KEY = "678025f9b853729922748d16feb442f9"
}
class APICaller {
static let shared = APICaller()
}
- 아래 사이트 방문하여 trending 이라는 조건에 대한 결과 확인
https://developer.themoviedb.org/reference/trending-people
- APICaller 파일 내에 Constants에 URL 등의 값을 입력한다.
struct Constants {
static let API_KEY = "678025f9b853729922748d16feb442f9"
static let baseURL = "https://api.themoviedb.org/"
}
- APICaller 클래스 내에 API 정보를 얻어올 메서드 설정
class APICaller {
static let shared = APICaller()
func getTrendingMovies(completion: @escaping (String) -> Void) {
guard let url = URL(string:"\(Constants.baseURL)3/trending/all/day?api_key=\(Constants.API_KEY)") else { return }
let task = URLSession.shared.dataTask(with: URLRequest(url: url)) { data, _, error in
guard let data = data, error == nil else { return }
do {
let results = try JSONSerialization.jsonObject(with: data, options: .fragmentsAllowed)
print(results)
} catch {
print(error.localizedDescription)
}
}
task.resume()
}
}
- 홈뷰컨트롤러에 들어가서 APICaller 내의 getTrendingMovies가 정상 동작하는지 확인한다.
// API를 통해 영화정보 얻어오기
private func getTrendingMovies() {
APICaller.shared.getTrendingMovies { _ in
}
}
- 위에서 작성한 함수를 viewDidLoad() 메서드 내에서 호출한다.
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBackground
view.addSubview(homeFeedTable)
homeFeedTable.delegate = self
homeFeedTable.dataSource = self
configureNavbar()
getTrendingMovies()
// homeFeedTable의 헤더 공간 만들기
let headerView = HeroHeaderUIView(frame: CGRect(x: 0, y: 0, width: view.bounds.width, height: 450))
homeFeedTable.tableHeaderView = headerView
}
- 앱을 실행하고 콘솔창을 확인한다.
- 위에서 출력된 내용을 토대로 데이터 모델을 생성한다.
- Models 폴더 안에 Movie 라는 스위프트 파일을 만든다.
import Foundation
struct TrendingMoviesResponse: Codable {
let results: [Movie]
}
struct Movie: Codable {
let id: Int
let media_type: String?
let original_name: String?
let original_title: String?
let poster_path: String?
let vote_count: Int
let release_date: String?
let vote_average: Double
}
- APICaller 클래스 내에 getTrendingMovies 메서드를 위해 작성한 데이터 모델 타입으로 결과를 반환할 수 있도록 코드를 수정한다.다.
class APICaller {
static let shared = APICaller()
func getTrendingMovies(completion: @escaping (String) -> Void) {
guard let url = URL(string:"\(Constants.baseURL)3/trending/all/day?api_key=\(Constants.API_KEY)") else { return }
let task = URLSession.shared.dataTask(with: URLRequest(url: url)) { data, _, error in
guard let data = data, error == nil else { return }
do {
let results = try JSONDecoder().decode(TrendingMoviesResponse.self, from: data)
print(results)
} catch {
print(error.localizedDescription)
}
}
task.resume()
}
}
- 스위프트의 result를 통해 코드를 간결화한다.
- APIError 열거형을 생성한다.
enum APIError: Error {
case failedTogetData
}
- APICaller 클래스 내의 getTrendingMovies 메서드를 result 구문으로 사용할 수 있도록 수정한다.
class APICaller {
static let shared = APICaller()
func getTrendingMovies(completion: @escaping (Result<[Movie], Error>) -> Void) {
guard let url = URL(string:"\(Constants.baseURL)3/trending/all/day?api_key=\(Constants.API_KEY)") else { return }
let task = URLSession.shared.dataTask(with: URLRequest(url: url)) { data, _, error in
guard let data = data, error == nil else { return }
do {
let results = try JSONDecoder().decode(TrendingMoviesResponse.self, from: data)
completion(.success(results.results))
} catch {
completion(.failure(error))
}
}
task.resume()
}
}
- 홈뷰컨틀로러에서 생성한 getTrendingMovies 메서드를 수정한다.
private func getTrendingMovies() {
APICaller.shared.getTrendingMovies { results in
switch results {
case.success(let movies):
print(movies)
case.failure(let error):
print(error.localizedDescription)
}
}
}
https://youtu.be/IhUz6tTT7zI?si=abhJfwBam60jd4KI
'Project > NETFLIX' 카테고리의 다른 글
NETFLIX CLONE 7편 (오픈소스 SDWebImage, 컬렉션뷰셀 적용) (0) | 2024.05.08 |
---|---|
NETFLIX CLONE 6편 (String 기능 확장, 섹션별 함수 생성) (0) | 2024.05.08 |
NETFLIX CLONE 4편 (네비게이션 설정, 각 셀의 머리말 설정) (1) | 2024.05.05 |
NETFLIX CLONE 3편 (테이블 헤더 뷰에 이미지, 버튼 할당) (0) | 2024.05.03 |
NETFLIX CLONE 2편 (테이블뷰 선언, 테이블 뷰 셀 내에 컬렉션뷰 삽입) (0) | 2024.05.03 |