iOS

[iOS] OpenAPI 영화순위 앱 만들기 (2)

코딩하는둥이 2024. 5. 9. 12:37

웹에서 다운 받을 시 이런 안내문구가 뜨는데 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