简体   繁体   English

JSON 解码未填充表视图

[英]JSON Decoding Not Populating Table View

I am trying to parse data from the website movieDatabase.com However there's some issue decoding the data to json and populating my table view.I am not sure why this is happening.我正在尝试从网站 movieDatabase.com 解析数据但是将数据解码为 json 并填充我的表视图时出现了一些问题。我不确定为什么会这样。 Please I need help spotting out the problem.请帮助我找出问题所在。 Here's my code.这是我的代码。 https://github.com/lexypaul13/Movie-Browser/tree/main/Movie-Browser https://github.com/lexypaul13/Movie-Browser/tree/main/Movie-Browser

struct Movies: Codable {
    let overview:String?
    let original_title: String?
    let poster_path:String
}


struct ApiResponse:Codable, Hashable {
    let page:Int
    let shows:[Movies]

    enum CodingKeys:String, CodingKey {
        case page = "page"
        case shows = "results"
    }
}



class NetworkManger{

    enum EndPoint{
        case showList
    }

    static let shared = NetworkManger()
    private let baseURL : String
    private var  apiKeyPathCompononent :String

    private init(){
        self.baseURL = "https://api.themoviedb.org/3/movie/now_playing?"
        self.apiKeyPathCompononent =  "api_key=a07e22bc18f5cb106bfe4cc1f83ad8ed"
    }
    private var jsonDecoder:JSONDecoder = {
        let decoder = JSONDecoder()
        decoder.keyDecodingStrategy = .convertFromSnakeCase
        return decoder
    }()



    func get<T:Decodable>(_ endPoints: EndPoint, urlString: String,  completed:@escaping(Result<T?,ErroMessage>)->Void){
        guard let url = urlBuilder(endPoint: endPoints) else {
            completed(.failure(.invalidURL))
            return
        }

        let task = URLSession.shared.dataTask(with: url){ data, response, error in
            if let _ = error {
                completed(.failure(.unableToComplete))
                return
            }

            guard let response = response as? HTTPURLResponse, response.statusCode==200 else {
                print(ErroMessage.invalidResponse.rawValue)
                completed(.failure(.invalidResponse))
                return
            }

            guard let data = data else{
                completed(.failure(.invalidData))
                return
            }
            do{
                let apiResponse = try self.jsonDecoder.decode([T].self, from: data)
                DispatchQueue.main.async {
                    completed(.success(apiResponse as? T))
                }

            } catch{
                print(ErroMessage.invalidData.rawValue)
            }
        }
        task.resume()
    }
    private func urlBuilder(endPoint:EndPoint )->URL?{
        switch endPoint {
        case .showList:
            return URL(string: baseURL + apiKeyPathCompononent )
        }
    }

    func getMovies(){
        NetworkManger.shared.get(.showList, urlString: "") { [weak self] (result: Result<[Movies]?,ErroMessage> ) in
            guard let self = self else { return }
            switch result{
            case .success(let movies):
                self.movies = movies ?? []
                DispatchQueue.main.async {self.tableView.reloadData()}

            case .failure(let error):
                print(error.localizedDescription)
            }

        }
    }
}

The root object returned from the api is your ApiResult struct.从 api 返回的根 object 是您的ApiResult结构。 This contains an array of movies (which you have mapped to the shows property of the ApiResult )这包含一个电影数组(您已将其映射到ApiResultshows属性)

You need to change the getMovies function so that the right generic type can be inferred and the json decoder can do the right thing您需要更改getMovies function 以便可以推断出正确的泛型类型并且 json 解码器可以做正确的事情

func getMovies(){
        NetworkManger.shared.get(.showList, urlString: "") { [weak self] (result: Result<ApiResult,ErroMessage> ) in
            guard let self = self else { return }
            switch result{
            case .success(let apiResult):
                self.movies = apiResult.shows
                DispatchQueue.main.async {self.tableView.reloadData()}

            case .failure(let error):
                print(error.localizedDescription)
            }

        }
    } 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM