我致电getPrizesData
func viewDidLoad()
我在完成下载JSON数据后调用reload
。
但它没有在tableview中刷新我的单元格,
如何解决?感谢
@IBOutlet var invoice: UITableView!
func getPrizesData()-> Void{
let url = NSURL(string: "http://localhost:3002/invoices.json")
let sharedSession = NSURLSession.sharedSession()
let downloadTask: NSURLSessionDownloadTask =
sharedSession.downloadTaskWithURL(url,
completionHandler: {(location: NSURL!, response: NSURLResponse!, error: NSError!)->Void in
if (error == nil){
let dataObject = NSData(contentsOfURL: location)
if let prizes = NSJSONSerialization.JSONObjectWithData(dataObject, options: .MutableLeaves, error: nil) as? NSArray {
let prizesDictionary = prizes[0] as NSDictionary
let toPrizesArray = prizesDictionary["to_prizes"] as NSArray
self.items = toPrizesArray as [AnyObject] as [String]
self.invoice.reloadData()
}
else {
println("error")
}
}else{
println(error)
}
})
downloadTask.resume()
}
答案 0 :(得分:6)
数据在非主线程上下载。 UI必须仅从主线程更新。
dispatch_async(dispatch_get_main_queue()) {
self.invoice.reloadData()
}
答案 1 :(得分:3)
downloadTaskWithURL
方法在后台线程上调用其完成处理程序。必须在主线程上执行所有UI更新(例如重新加载tableView数据)。当数据准备就绪时,您可以使用GCD在主线程上更新tableView。 E.g。
dispatch_async(dispatch_get_main_queue(), {
self.invoice.reloadData()
})
答案 2 :(得分:0)
Swift 3更新 您只能在主队列
上更新UI1.异步获取主队列
DispatchQueue.main.async {
//code for updating the UI
}
2.同步获取主队列
DispatchQueue.main.sync{
//code for updating the UI
}
答案 3 :(得分:0)
必须在主线程更新ui,所以使用如下代码:
DispatchQueue.main.async {
self.invoice.reloadData()
}
注意:适用于 swift 5