ios - 集合视图未显示从 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)
}
}
}
解决方案
请更换型号
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 '致命:提供的项目标识符不是唯一的
推荐阅读
- php - Php Memcached 的 PAYLOAD_FAILURE 错误以及如何在 perl 中设置与 php-memcached 兼容的值
- jobs - 完成作业后如何在 slurm 作业管理器中获取 cputime 和等待时间
- android - 使用 rxkotlin 填充 RecyclerView:Recyclerview 保持为空
- r - 使用 mlr 进行递归特征消除
- javascript - 传单控制层:选择器
- web-crawler - OWASP ZAP - 2 个初学者问题
- html - 当我想在中心对齐内容时,Justify-self 不起作用
- javascript - 如何使用 Ajax 删除加载到 DOM 中的 xml 文件
- python-3.x - 引用结构通常会使用 64 位还是 32 位?
- php - PHP session_start 不接触会话文件