Json数据未显示在tableView swift 5上

Posted

技术标签:

【中文标题】Json数据未显示在tableView swift 5上【英文标题】:Json data not showing on tableView swift 5 【发布时间】:2020-07-12 16:47:44 【问题描述】:

我获取了数据,它在打印时显示,但是当我尝试在 tableview 上显示它时。什么都没有发生

我是否将 tableview.reloadData 放在了错误的位置?

override func viewDidLoad() 
    super.viewDidLoad()
    fetchData()
    tableView.reloadData() 



func fetchData()
     
    if let url = URL(string: urlConstant) 
       
        let session = URLSession(configuration: .default)
        let task = session.dataTask(with: url)  (data, res, err) in
       
            if err == nil
            
                let decoder = JSONDecoder()
                if let safeData = data
                
                    do
                        let results = try decoder.decode(Results.self, from: safeData)
                        
                        guard let array = results.Result as? [Products] else return 
                 
                        for product in array
                      
    
                        self.productArray.append(product)
                        
                      catch 
                        print(error)
                                        
                
            
        
        task.resume()            
    
    
    self.tableView.reloadData()

【问题讨论】:

self.tableView.reloadData() 很快就会被调用,然后再执行 for 循环 self.productArray.append(product)。您缺少异步概念。要检查吗?在您的 reloadData() 之前添加一个打印,并在您的 for 循环中添加一个。检查之前打印的是哪一个。另外,检查 `self.productArray.append(product)` 是否被调用(解析顺利等) @Larme 我在第一次调用 relodData() 之前尝试了你所说的并打印。我应该在哪里使用异步概念? 在你的代码中放置一些断点来查看执行的顺序。 不相关但删除 viewDidLoad 中的 tableView.reloadData()。它没有效果。 【参考方案1】:

如果您从服务器获得正确的响应(检查一次),那么接下来您需要在从服务器获得响应并填充数组后重新加载 tableView。

func fetchData() 
        if let url = URL(string: urlConstant) 
            let session = URLSession(configuration: .default)
            let task = session.dataTask(with: url)  (data, res, err) in
                if err == nil
                
                    let decoder = JSONDecoder()
                    if let safeData = data
                    
                        do
                            let results = try decoder.decode(Results.self, from: safeData)
                            guard let array = results.Result as? [Products] else return 
                            for product in array 
                              self.productArray.append(product)
                            
                            // Reload table view here
                           DispatchQueue.main.async 
                            self.tableView.reloadData()
                          
                         catch 
                            print(error)
                        
                    
                
            
            task.resume()
        
    

或者,您可以添加在 fetchData 方法中处理的完成。

【讨论】:

我试过这样做它显示 UITableview.reloadData() 必须仅从主线程使用 @Motivationgym5 在 fetchData() 中添加 completionHandler 会很好。有了这个,您可以将 UI 事物与网络调用分开。编码愉快。

以上是关于Json数据未显示在tableView swift 5上的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift TableView 中显示 JSON 数据的问题

TableView Parse Swift 数据未显示在应用程序中

Swift:将数据从 tableView 显示到另一个 ViewController(JSON、Alamorife、AlamofireImage)

TableView 没有加载任何 JSON 数据 Swift 4

Swift - 表视图未填充数据但未显示错误

Swift 解析查询结果未出现在 tableview 中