如何在下载JSON数据后重新加载tableview的数据

时间:2014-10-23 11:40:10

标签: ios swift uitableview

我致电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()
}

4 个答案:

答案 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更新 您只能在主队列

上更新UI

1.异步获取主队列

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