Kri*_*ofe 2 asynchronous uitableview ios 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()
}
Run Code Online (Sandbox Code Playgroud)
您永远不要从后台线程访问任何UI,而必须从主线程访问它,为此,您可以使用gcd:
DispatchQueue.main.async {
self.tableView.reloadData()
}
Run Code Online (Sandbox Code Playgroud)
虽然有时可能会从后台线程访问UI(读取UIKit的所有内容),但最终会遇到bug,包括崩溃,显示爆炸或gazenbug。