首页 > 解决方案 > 集合视图未显示从 api.themoviedb.org 收到的数据

问题描述

我正在尝试创建一个显示电视节目列表的集合视图。当我运行代码时,它显示错误消息“请检查 Internet 连接”。我已将问题缩小到网络管理器;显然,从服务器接收到的数据有问题。我不知道为什么;我检查了 baseurl 变量中的标头参数,看看是否有问题但没有问题。有人可以帮忙吗?项目链接如下。(已编辑)https://github.com/lexypaul13/Trending-Tv-Shows

class NetworkManger {
    
     static let shared = NetworkManger()
     let baseURL = "https://api.themoviedb.org/3/trending/tv/week?api_key=352b794e6bc3be2fe8b0b6b3d7221ac1"
     let cache   = NSCache<NSString, UIImage>()

    private init (){}

    
    func getShows(page: Int, completed:@escaping(Result<[Shows],ErroMessage>)->Void){
        
        let endpoint = baseURL + "&language=en-US&page=\(page)"
        guard let url = URL(string: endpoint) else{
            completed(.failure(.invalidTvName))
            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 {
                completed(.failure(.invalidResponse))
                return
            }
            
            guard let data = data else{
                completed(.failure(.invalidData))
                return
            }
            do{
                let decoder = JSONDecoder()
                decoder.keyDecodingStrategy = .convertFromSnakeCase
                let show = try decoder.decode([Shows].self, from: data)
                completed(.success(show))
            } catch{
                completed(.failure(.invalidData))
            }
      


class WeeklyViewController: UIViewController, UISearchBarDelegate, UISearchResultsUpdating {
override func viewDidLoad() {
        super.viewDidLoad()
        configureViewcontroller()
        configureCollectionView()
        getTvshows(page:page)
        
    }
    
    func configureViewcontroller(){
        view.backgroundColor = .systemGray
        
    }
    
    func configureCollectionView(){
        collectionView = UICollectionView(frame: view.bounds, collectionViewLayout: createThreeColumnFlowLayout())
        view.addSubview(collectionView)
        collectionView.delegate = self
        collectionView.backgroundColor = .systemGray
        collectionView.register(TvCellCollectionViewCell.self, forCellWithReuseIdentifier: TvCellCollectionViewCell.reuseID)
    }
    
    func configureDataSource(){
        dataSource = UICollectionViewDiffableDataSource<Section, Shows>(collectionView: collectionView, cellProvider: {
            (collectionView, indexPath, shows) -> UICollectionViewCell? in
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: TvCellCollectionViewCell.reuseID, for: indexPath) as! TvCellCollectionViewCell
            cell.setCell(shows: shows)
            return cell
        })
    }
    

    func configureSearch(){
        let searchController = UISearchController()
        searchController.searchResultsUpdater = self
        searchController.searchBar.delegate = self
        searchController.searchBar.placeholder = "Seach Tv Shows"
        searchController.obscuresBackgroundDuringPresentation = false
        navigationItem.searchController = searchController
    }
    
    
    func getTvshows(page:Int){
        showLoadingView()
        NetworkManger.shared.getShows(page: page) { [weak self] result in
            guard let self = self else { return }
            self.dismissLoadingView()
            switch result{
            case .success(let shows):
                self.updateUI(shows)
            case .failure(let error):
                DispatchQueue.main.async {
                    let alert = UIAlertController(title: "Check Internet Connection", message: error.rawValue,preferredStyle: UIAlertController.Style.alert)
                    alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))
                    self.present(alert, animated: true, completion: nil)
                }
            }
        }
    }
    
    func updateUI(_ shows:[Shows]){
        self.shows.append(contentsOf: shows)
        if self.shows.isEmpty{
            let alert = UIAlertController(title: "Tv Show Doesnt Exist", message: nil,preferredStyle: UIAlertController.Style.alert)
            alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }
        self.updateData(shows: self.shows)
        
    }
    
    func updateData(shows:[Shows]){ //shows follwers
        var snapshot = NSDiffableDataSourceSnapshot<Section,Shows>()
        snapshot.appendSections([.main])
        snapshot.appendItems(shows)
        DispatchQueue.main.async {
            self.dataSource.apply(snapshot,animatingDifferences: true)
        }
    }
    
}

extension WeeklyViewController:UICollectionViewDelegate{
    
    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        let offsetY = scrollView.contentOffset.y
        let contentHeight = scrollView.contentSize.height
        let height = scrollView.frame.size.height
        if offsetY > contentHeight-height{ ///check to see if bottom of screen is reached
            page += 1 ///increments ppage number when screen reaches
            getTvshows(page: page)
        }
    }
}

标签: iosswift

解决方案


请更换型号

class Welcome: Codable {
    let page: Int?
    let results: [Shows]?

    init(page: Int?, results: [Shows]?) {
        self.page = page
        self.results = results
    }
 }

// MARK: - Result
struct Shows: Codable,Hashable {
    let posterPath, originalName: String?

    enum CodingKeys: String, CodingKey {
        case posterPath = "poster_path"
        case originalName = "original_name"
    }

    init(posterPath: String?, originalName: String?) {
        self.posterPath = posterPath
        self.originalName = originalName
    }
}

比改变解码

do{
   let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let show = try decoder.decode(Welcome.self, from: data)
     completed(.success(show.results ?? []))
 } catch{
     completed(.failure(.invalidData))
 }
//Change in cell
func setCell(shows:Shows){
    tvImage.downloadAvatarImage(shows.posterPath!)
    tvName.text = shows.originalName
}

成功运行应用程序后,您的错误“请检查 Internet 连接”消失了,但新错误 appery '致命:提供的项目标识符不是唯一的


推荐阅读