Swift开发:如何将解析后的JSON数据加载到TableView数组展示
核心问题点
- 重复创建
EntertainmentApi实例:代码里var A = EntertainmentApi()和var AA = EntertainmentApi().userFeedPosts创建了两个完全独立的接口实例,请求回来的数据存在第一个实例里,第二个实例的userFeedPosts永远是空数组 - 数据源行数写死:
numberOfRowsInSection固定返回2,没有和实际请求回来的数据量绑定 - 异步请求后没有触发UI刷新:网络请求是异步执行的,
viewDidLoad里调用reloadData时数据还没返回,数据回来后没有重新刷新TableView - Cell赋值逻辑错误:
cellForRowAt里遍历整个数据源数组给单个Cell赋值,会导致所有Cell都展示数组最后一条数据 - 网络请求回调在后台线程,直接刷新UI会出现异常,需要切回主线程操作
修正后的核心代码
EntertainmentViewController 部分
import Foundation import UIKit import SDWebImage class EntertainmentViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { // 只保留一个接口实例 let entertainmentApi = EntertainmentApi() // 统一用一个数据源数组 var dataSource = [EntertainmentPageData]() @IBOutlet weak var entPostTableView: UITableView! override func viewDidLoad() { super.viewDidLoad() entPostTableView.register(EntertainmentViewrTableViewCell.nib(), forCellReuseIdentifier: EntertainmentViewrTableViewCell.identifier) entPostTableView.delegate = self entPostTableView.dataSource = self // 调用带回调的接口方法获取数据 entertainmentApi.getFeedPosts { [weak self] postList in guard let self = self else { return } // 赋值数据源 self.dataSource = postList // 切回主线程刷新TableView DispatchQueue.main.async { self.entPostTableView.reloadData() } } } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // 返回实际数据源数量 return dataSource.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let customCell = tableView.dequeueReusableCell(withIdentifier: EntertainmentViewrTableViewCell.identifier, for: indexPath) as! EntertainmentViewrTableViewCell // 只取当前indexPath对应的数据赋值 let currentPost = dataSource[indexPath.row] customCell.configue(with: currentPost.postDisplayName, PostImage: currentPost.imageURLString, PostDescription: currentPost.postDescription) return customCell } }
可选优化
EntertainmentApi 可以删除冗余的load方法,只用带回调的getFeedPosts即可,避免数据同步问题。
内容的提问来源于stack exchange,提问作者Racer
相关产品推荐
相关产品推荐

