You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:36:03