我使用URLSession
从资源API获取tableview'数据的数据。因此,在URLSession任务准备好数据后,我需要reloadData()
。但这将导致,
UITableView.reloadData()必须仅在主线程中使用
当我运行应用程序时,开始时tableview是空白的。只有在我屏幕显示数据后才会显示。但是如果不在URLSession任务中调用reloadData()
,则屏幕一直是空白的。
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()
}
答案 0 :(得分:3)
你永远不应该从后台线程访问任何UI,你必须从主线程中执行它,为此你可以使用gcd:
DispatchQueue.main.async {
self.tableView.reloadData()
}
虽然从后台线程访问UI(读取所有UIKit)可能会有效,但最终会出现包括崩溃,炸毁显示或gazenbugs在内的错误。
答案 1 :(得分:2)
您无法在后台线程中执行任何UI更新操作。所以可以把它放在主线程中。
DispatchQueue.main.async {
tableView.reloadData()
}
如果您尝试在后台线程中执行UI操作,则会导致崩溃。
答案 2 :(得分:1)
试试这个
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]
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
} catch let error {
print(error)
}
}
task.resume()
}
答案 3 :(得分:1)
DispatchQueue.main.async(execute: {
yourTableView.reloadData()
})
我希望它能奏效。