tableView.reloadData()如何正确重新加载数据?

时间:2016-10-12 07:04:22

标签: swift tableview reloaddata

class ProductTableViewController: UITableViewController 
{
    var products = [Product]()

    override func viewDidLoad() {
        super.viewDidLoad()
        getData()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       return products.count // zero
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ProductCell", for: indexPath) as! ProductCell
        cell.userIdLabel?.text = "user id" + "$\(products[indexPath.row].userId)"
        cell.idLabel?.text = "id" + "$\(products[indexPath.row].id)"
        cell.titleLabel?.text = products[indexPath.row].title
        cell.bodyLabel?.text = products[indexPath.row].body
        return cell
    }

    func getData(){
        let url = URL(string: "https://jsonplaceholder.typicode.com/posts")
        URLSession.shared.dataTask(with:url!, completionHandler: {(data, response, error) in
            guard let data = data, error == nil else { return }
            do {
                let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [[String:Any]]
                for post in json{
                    let product = Product()
                    product.userId = post["userId"] as! Int
                    product.id = post["id"] as! Int
                    product.title = post["title"] as! String
                    product.body = post["body"] as! String
                    self.products.append(product)
                }
                //OperationQueue.main.addOperation({ () -> Void in self.tableView.reloadData()})
            } catch let error as NSError {
                print(error)
            }
//HERE!!!
            OperationQueue.main.addOperation({ () -> Void in self.tableView.reloadData()})
        }).resume()
    }
}

当我的UITableViewController首先执行时将实现func tableView并且他将返回零计数因为getData()还没有运行,当然第二个返回我的Cell的tableView将不会实现。
现在,我想看看解析我getData()的内容,以便尝试使用OperationQueue.main.addOperation({ () -> Void in self.tableView.reloadData()})重新加载我的tableView但是发现错误:

  

Thread1:SIGABRT。

我应该如何正确地重新加载我的tableView?

1 个答案:

答案 0 :(得分:1)

试试这个

func getData(){
    let url = URL(string: "https://jsonplaceholder.typicode.com/posts")
    URLSession.shared.dataTask(with:url!, completionHandler: {(data, response, error) in
        guard let data = data, error == nil else { return }
        do {
            let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [[String:Any]]
            for post in json{
                let product = Product()
                product.userId = post["userId"] as! Int
                product.id = post["id"] as! Int
                product.title = post["title"] as! String
                product.body = post["body"] as! String
                self.products.append(product)
            }
            // just reload here after finish appends
            self.tableView.reloadData()
        } catch let error as NSError {
            print(error)
        }
    }).resume()
}