我用来URLSession从用于tableview的数据的资源API中获取数据。所以我需要reloadData()在URLSession任务准备好数据之后。但这会导致
URLSession
reloadData()
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() }
您永远不要从后台线程访问任何UI,而必须从主线程访问它,为此,您可以使用gcd:
DispatchQueue.main.async { self.tableView.reloadData() }
从后台线程访问UI(读取UIKit的所有内容)有时可能会起作用,但最终会遇到bug,包括崩溃,显示爆炸或gazenbug。