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

无法通过Alamofire&SwiftyJSON在TableViewCell加载加密货币JSON数据

解决加密货币数据加载到TableView的问题

我来帮你排查并解决这个问题——核心问题在于网络请求是异步操作,你在调用getCoinData后立刻执行tableView.reloadData(),这时候数据还没从服务器返回,所以TableView自然加载不到内容。另外我们还要优化数据解析和TableView数据源方法的实现,具体修正如下:

修正后的完整代码

import UIKit
import Alamofire
import SwiftyJSON

class TableViewController: UITableViewController {
    // 改用[JSON]类型,更适配SwiftyJSON的解析逻辑
    var coins = [JSON]()
    let url = "https://api.coinmarketcap.com/v1/ticker/"

    override func viewDidLoad() {
        super.viewDidLoad()
        getCoinData(url: url)
        // 这里不要提前调用reloadData,等请求完成后再刷新UI
    }

    // 封装网络请求方法,处理异步逻辑
    func getCoinData(url: String) {
        Alamofire.request(url, method: .get).responseJSON { response in
            switch response.result {
            case .success(let value):
                // 用SwiftyJSON解析返回的JSON数组
                let json = JSON(value)
                self.coins = json.arrayValue
                
                // 必须切换到主线程刷新TableView(UI操作只能在主线程执行)
                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
            case .failure(let error):
                // 打印错误信息方便调试
                print("数据请求失败:\(error.localizedDescription)")
            }
        }
    }

    // MARK: - TableView数据源方法
    override func numberOfSections(in tableView: UITableView) -> Int {
        // 只需要一个分组
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // 返回硬币数据的数量,决定TableView的行数
        return coins.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // 确保复用ID和Storyboard/Xib中的一致
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        
        // 获取当前行对应的硬币数据
        let coin = coins[indexPath.row]
        
        // 从JSON中安全取出name和symbol(stringValue避免nil崩溃)
        cell.textLabel?.text = coin["name"].stringValue
        cell.detailTextLabel?.text = coin["symbol"].stringValue
        
        return cell
    }
}

关键注意事项

  • 异步请求的UI更新:网络请求在后台线程执行,必须通过DispatchQueue.main.async切换到主线程刷新TableView,否则UI不会更新。
  • SwiftyJSON的安全解析:用arrayValue将返回的JSON转为数组,用stringValue安全获取字符串,避免因字段缺失导致的崩溃。
  • Cell样式检查:确保你的TableViewCell样式是Subtitle(默认的Basic样式没有detailTextLabel),可以在Storyboard中设置Cell的Style为Subtitle,或者代码初始化Cell时指定style: .subtitle。
  • 复用ID一致性:代码中的reuseIdentifier必须和Storyboard/Xib中设置的Cell复用ID完全一致,否则会导致无法获取Cell。

内容的提问来源于stack exchange,提问作者Akshay Jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:36:16