【问题标题】:Json data not showing on tableView swift 5Json数据未显示在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()。它没有效果。

标签: ios swift swift5


【解决方案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 事物与网络调用分开。编码愉快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
相关资源
最近更新 更多