代码之家  ›  专栏  ›  技术社区  ›  Cameron Reilly

无法获取API调用以及时运行tableview swift 4 xcode 9

  •  0
  • Cameron Reilly  · 技术社区  · 6 年前

    我试图获取一个API调用来填充列表视图的单元格,但似乎无法在生成单元格之前获取要收集的数据。我试过制作一个类似的完成处理程序 here 以及来自同一链接的信号量。虽然完成处理程序已编译,但在执行时仍然没有及时获取数据(无可否认,这是我第一次尝试使用完成处理程序)。以下是没有完成处理程序的原始代码:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        RestaurantListView.delegate = self
        RestaurantListView.dataSource = self
        //API setup
        guard let url = URL(string: "https://myURL.com") else {
            print("ERROR: Invalid URL")
            return
        }
        let task = URLSession.shared.dataTask(with: url) {
    
            (data, response, error) -> Void in
    
            // URL request is complete
            guard let data = data else {
                print("ERROR: Unable to access content")
                return
            }
    
            guard let blog = try? JSONDecoder().decode(Blog.self, from: data) else {
                print("Error: Couldn't decode data into Blog")
                return
            }
            self.myData = blog
        }
        task.resume()
    }
    

    表格和单元格在以下函数下初始化:

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 100
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = RestaurantListView.dequeueReusableCell(withIdentifier: "cell")
        cell?.textLabel?.text = myAPIValue
        return cell!
        }
    

    我有几个print语句来跟踪程序,它通过viewDidLoad,然后是第一个tableView来设置表,然后是第二个tableView来处理单元格,最后是URL任务。

    我已经重写了几十种不同的方式,不知道如何以正确的顺序执行。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Shehata Gamal    6 年前

    您需要重新加载表,如此行所示 URLSession.shared.dataTask(with: url) 触发与代码行顺序不同的异步任务

    guard let blog = try? JSONDecoder().decode(Blog.self, from: data) else {
         print("Error: Couldn't decode data into Blog")
         return
    }
    self.myData = blog
    
    DispatchQueue.main.async{
        RestaurantListView.reloadData()
    }
    
        2
  •  1
  •   Amjimenez    6 年前

    您必须将数据保存在变量中,如下所示,我使用 阵列数据 .看看 重载数据() 保存数据后调用的函数。

    func downloadData (){
        let url = URL(string: "http://www.url.com")
    
        if let url = url {
            let task = URLSession.shared.dataTask(with: url, completionHandler: {(data, response, error) in
                do {
                    if let dataResponse = data{
                        let responseDecoded = try JSONDecoder().decode(Response.self, from: dataResponse)
                        DispatchQueue.main.async {
                            self.arrayOfData = responseDecoded.results ?? []
                            self.RestaurantListView.reloadData()
                        }
                    } 
                }
                catch {
                    print("Error: \(error)")
                }
            })
    
            task.resume()
        }
    }
    

    您必须使协议与该数据一致

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        /**If you have no elements you should return 0**/
        return arrayOfData.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = RestaurantListView.dequeueReusableCell(withIdentifier: "cell"){
            cell.textLabel?.text = arrayOfData[indexPath.row].name
            return cell
        }
        return UITableViewCell()
    }