如何在表视图中正确显示通过完成处理程序接收到的解析数据



我需要在tableView中显示关于电影的信息(取自https://developers.themoviedb.org/)。我正在做网络请求使用一个单例,然后通过完成处理程序传递已解析的数据到tableViewController。我可以打印接收到的数据,但不能在tableviewcell中正确设置。你能帮我解决这个问题吗?

网络经理

func getMovies(completion: @escaping ([Movies]?) -> Void) {

guard let url = URL(string: "https://api.themoviedb.org/3/movie/now_playing?api_key=(apiKey)&language=en")
else { fatalError("Wrong URL") }

URLSession.shared.dataTask(with: url) { (data, response, error) in

if let jsonData = data {
let decoder = JSONDecoder()
do {
let moviesResult = try decoder.decode(MoviesResult.self, from: jsonData)
let movies = moviesResult.results
completion(movies)
}
catch {
print(error)
}
}
}.resume()

}

电影视图控制器

var movies = [Movies]()

override func viewDidLoad() {
super.viewDidLoad()

network.getMovies { result in
if let result = result {
self.movies = result
print(self.movies)
}
}
extension MoviesViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return movies.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let movie = movies[indexPath.row]
print(movie)

if let cell = tableView.dequeueReusableCell(withIdentifier: "moviesMainInfo", for: indexPath) as? MovieTableViewCell {

cell.filmTitle.text = movie.title
cell.filmRating.text = String(movie.popularity!)
return cell
}
return UITableViewCell()
}
}

解析结果: [MovieApp。电影(genreid:可选([14,28,12]),概述:可选("神奇女侠在20世纪80年代冷战期间与苏联发生冲突,并发现了一个强大的敌人猎豹的名字),受欢迎程度:可选(1927.057),标题:可选("神奇女侠1984"),发行日期:可选("2020-12-16"),海报路径:可选("/8ulwhlmpgzm9bx6qyh0nfoq67z .jpg"),

你做的一切都是正确的,你只需要在数据到达时重新加载你的UITableView。请注意,您需要在主线程上重新加载UITableView,因为UIKit不是线程安全的:

否则你的应用程序很可能崩溃:

private func reloadTableView() {
DispatchQueue.main.async {
self.tableView.reloadData()
}
}

我还鼓励您从viewDidLoad中提取您的网络功能。另一个改进是在闭包中使用[weak self]来避免内存泄漏:

private func loadData() {
network.getMovies { [weak self] result in
if let result = result {
self?.movies = result
print(self?.movies)
self?.reloadTableView()
} else {
// Maybe show some info that the data could not be fetched
}
}
}

viewDidLoad中写入:

override func viewDidLoad() {
super.viewDidLoad()
loadData()
}

相关内容

最新更新