Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Json数据未显示在tableView swift 5上_Ios_Swift_Swift5 - Fatal编程技术网

Ios Json数据未显示在tableView swift 5上

Ios Json数据未显示在tableView swift 5上,ios,swift,swift5,Ios,Swift,Swift5,我获取了数据,打印时显示出来,但当我试图在tableview上显示时,什么也没有出现 我是否将tableview.reloadData放置在错误的位置 override func viewDidLoad() { super.viewDidLoad() fetchData() tableView.reloadData() } func fetchData() { if let url = URL(string: urlConstant) {

我获取了数据,打印时显示出来,但当我试图在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()
}

如果从服务器获得正确的响应(检查一次),那么接下来需要在从服务器获得响应并填充阵列后重新加载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方法中处理的完成。

self.tableView.reloadData()
很快就会被调用,然后再执行for循环
self.productArray.append(product)
。您缺少异步概念。想查查吗?在
重新加载数据()之前添加一个打印,并在for循环中添加一个。在打印之前检查哪一个。另外,请检查是否调用了'self.productArray.append(product)'(解析进行得很顺利,等等)@Larme我尝试了您所说的,并在首先调用relodData()之前打印了。我应该在哪里使用异步概念?在代码中放置一些断点以查看执行顺序。不相关但删除
tableView.reloadData()
viewDidLoad
中。它没有效果。我尝试过这样做,但它显示的是UITableview。必须从主线程使用reloadData()only@Motivationgym5更新了我的答案。检查一下。谢谢,伙计,我在附加东西上添加了这个概念。很好,你的ans正在为你工作me@Motivationgym5最好在fetchData()中添加completionHandler。通过这种方式,您可以将UI内容与网络调用分开。快乐编码。