无法及时 API 调用 运行 用于表视图 swift 4 xcode 9

Cannot get API call to run in time for tableview swift 4 xcode 9

我正在尝试调用 API 来填充列表视图的单元格,但似乎无法在生成单元格之前收集要收集的数据。我试过制作一个像 这样的完成处理程序,但没有成功,也尝试制作来自相同 link 的信号量。 completion handler编译的时候,执行的时候还是没有及时获取到数据(诚然,这是我第一次尝试completion handler)。这是原始代码 w/o 完成处理程序:

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()
}

table 和单元格在这些函数下初始化:

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!
    }

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

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

您需要重新加载 table ,因为此行 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()
}

您必须将数据保存在变量中,如下所示,我使用了 arrayOfData。查看保存数据后调用的 reloadData() 函数。

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()
}