카테고리 없음
[ 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"
}
}