웹에서 다운 받을 시 이런 안내문구가 뜨는데 Trust and Open 하면 된다.
시뮬레이션이 안 뜬다.
버전을 낮추면 시뮬레이션이 나온다.
네트워크 1단계
: URL 만들기
네트워크 2단계
: URLSession 만들기
네트워크 3단계
: URLSession 인스턴스에게 task 주기
네트워크 4단계
: task를 resume()
.self를 통해
예외처리
import UIKit
// 영화 데이터를 담을 구조체
struct MovieData: Codable {
let boxOfficeResult: BoxOfficeResult
}
// 박스 오피스 결과를 담을 구조체
struct BoxOfficeResult: Codable {
let dailyBoxOfficeList: [DailyBoxOfficeList]
}
// 일일 박스 오피스 목록을 담을 구조체
struct DailyBoxOfficeList: Codable {
let movieNm: String // 영화 이름
let audiCnt: String // 관객 수
let audiAcc: String // 누적 관객 수
let rank: String // 순위
}
class ViewController: UIViewController {
// 테이블 뷰 아웃렛
@IBOutlet weak var tableView: UITableView!
// 영화 데이터 저장 변수
var movieData: MovieData?
// API 요청 URL
let movieURL = "https://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=2013dc4148795492106afbbfb67eb6c2&targetDt="
override func viewDidLoad() {
super.viewDidLoad()
// 테이블 뷰의 데이터 소스와 델리게이트 설정
tableView.dataSource = self // 데이터 소스 설정
tableView.delegate = self // 델리게이트 설정
// 어제 날짜를 가져와서 API URL에 추가
let yesterday = makeYesterdayString()
let requestURL = movieURL + yesterday
fetchData(from: requestURL) // API 데이터 가져오기
}
// 어제 날짜 문자열 생성 함수
func makeYesterdayString() -> String {
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: Date())!
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyyMMdd"
return dateFormatter.string(from: yesterday)
}
// API에서 데이터 가져오는 함수
func fetchData(from url: String) {
guard let requestURL = URL(string: url) else { return }
URLSession.shared.dataTask(with: requestURL) { data, response, error in
// 데이터와 오류 확인
guard let data = data, error == nil else {
if let error = error {
print("Error fetching movie data: \(error)")
}
return
}
do {
// JSON 데이터 디코딩
let decodedData = try JSONDecoder().decode(MovieData.self, from: data)
self.movieData = decodedData
// 메인 스레드에서 테이블 뷰 새로고침
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch {
print("Error decoding movie data: \(error)")
}
}.resume()
}
}
// MARK: - UITableViewDataSource
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// 테이블 뷰의 행 수는 영화 데이터 배열의 크기와 동일
return movieData?.boxOfficeResult.dailyBoxOfficeList.count ?? 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as! MyTableViewCell
// 영화 데이터가 있으면 셀에 영화 이름 설정
if let movieName = movieData?.boxOfficeResult.dailyBoxOfficeList[indexPath.row].movieNm {
cell.movieName.text = movieName
}
return cell
}
}
// MARK: - UITableViewDelegate
extension ViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// 필요한 경우 행 선택 처리
}
}
'iOS' 카테고리의 다른 글
[iOS] 코드 정리 (0) | 2024.05.30 |
---|---|
[iOS] OpenAPI 영화순위 앱 만들기 (3) (0) | 2024.05.16 |
[iOS] OpenAPI 영화순위 앱 만들기 (1) (0) | 2024.05.02 |
[iOS] Open API로 실시간 영화 순위 (0) | 2024.04.11 |
[iOS] 옵셔널, 함수, 메서드 (0) | 2024.03.28 |