카테고리 없음

[ Swift ] Searching API 코드

박빅백 2020. 10. 26. 21:38

iOS 에서 네트워킹을 할때는 URL Session을 통해서 한다.

 

//1) 검색 API만들기
class SearchAPI {
    //타입메소드
    static func search(_ term: String,completion: @escaping ([Movie]) -> Void ){//completion 클로저 검색 한 후 클로저 실행할 수 있게.
                                                //@escaping이란? completion안에 있는 code block이 이 메소드 바깥에서도 실행된다(될수도 있다)
        //URL 세션을 생성하기 위해서는 Configuration이 필요하다고 했었고요 생성된 세션을 가지고 task(3) 중 data Task 를 할 예정이에요
        let session = URLSession(configuration: .default)
        
        var urlComponents = URLComponents(string: "https://itunes.apple.com/search?" )
        let mediaQuery = URLQueryItem(name: "media", value: "movie")
        let entityQuery = URLQueryItem(name: "entity", value: "movie")
        let termQuery = URLQueryItem(name: "term", value: term)
        urlComponents?.queryItems?.append(mediaQuery)
        urlComponents?.queryItems?.append(entityQuery)
        urlComponents?.queryItems?.append(termQuery)
        
        let requestURL = urlComponents?.url!
                                                        //응답데이터, response, error
        let dataTask = session.dataTask(with: requestURL!) { data, response, error in
            let successRange = 200..<300
            
            //에러 없는지 확인
            guard error == nil,
                  let statusCode = (response as? HTTPURLResponse)?.statusCode,
                  successRange.contains(statusCode) else {
                completion([])
                return
            }
            guard let resultData = data else{
                completion([])
                return
            }
            //data -> [Movie] 파싱해야함
           // let string = String(data: resultData, encoding: .utf8)
            
            let movies = SearchAPI.parseMovies(resultData)
            completion(movies)
            //completion([Movie])
        }//작업을 만들었다면 (dataTask) .resume을 통해서 네트워킹 작업을 시작해줬어요
        dataTask.resume()
    }
    static func parseMovies(_ data: Data) -> [Movie] {
        let decoder = JSONDecoder()
        do {
            let response = try decoder.decode(Response.self, from: data)
            let movies = response.movies
            return movies
        }catch let error {
            print("---> parsing error : \(error.localizedDescription)")
            return []
        }
    }
}

struct Response: Codable {// Json Data를 파싱하기 위해서는 Codable 써줘야함.
    let resultCount: Int
    let movies: [Movie]
    
    enum CodingKeys: String, CodingKey {
        case resultCount
        case movies = "results"
    }
}
struct Movie: Codable {//completion 핸들러를 위한 Struct Model
    let title: String
    let director: String
    let thumbnailPath: String
    let previewURL: String
    
    enum CodingKeys: String, CodingKey {
        case title = "trackName"
        case director = "artistName"
        case thumbnailPath = "artworkUrl100"
        case previewURL = "previewUrl"
    }
}