小编典典

在以异步方法准备数据之后,如何为表视图重新加载数据

swift

我用来URLSession从用于tableview的数据的资源API中获取数据。所以我需要reloadData()在URLSession任务准备好数据之后。但这会导致

UITableView.reloadData()必须仅在主线程中使用

当我运行该应用程序时,一开始的表视图为空白。只有在我滚动屏幕之后,数据才会显示。但是,如果未reloadData()在URLSession任务中调用,则屏幕始终是空白的。

func getData() {
    let dataUrl = URL(string: "http://www.example.com/app/?json=1")
    let task = URLSession.shared.dataTask(with: dataUrl! as URL) {data, response, error in
        guard let data = data, error == nil else { return }
        do {
            self.data = try JSONSerialization.jsonObject(with: data, options: []) as! [String:Any]
            self.tableView.reloadData()
            }

        } catch let error {
            print(error)
        }
    }
    task.resume()
}

阅读 245

收藏
2020-07-07

共1个答案

小编典典

您永远不要从后台线程访问任何UI,而必须从主线程访问它,为此,您可以使用gcd:

DispatchQueue.main.async {
    self.tableView.reloadData()
}

从后台线程访问UI(读取UIKit的所有内容)有时可能会起作用,但最终会遇到bug,包括崩溃,显示爆炸或gazenbug。

2020-07-07