TableView.reloadData() Как правильно перезагрузить данные?

#swift #tableview #reloaddata

#swift #просмотр таблицы #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 выполняемый в первую очередь будет реализовывать функцию TableView, и он вернет нулевое количество, потому getData() что еще не запущен и, конечно, второй TableView, который возвращает мою ячейку, не будет реализован.
И теперь я хочу посмотреть, что проанализировал мой getData() , чтобы я попытался перезагрузить свой TableView с помощью OperationQueue.main.addOperation({ () -> Void in self.tableView.reloadData()})
но поймал ошибку :

Поток 1: SIGABRT.

Как я должен правильно перезагрузить свой TableView?

Комментарии:

1. Что означает «будет реализована функция TableView»? Пожалуйста, улучшите свой вопрос с помощью редактирования. И добро пожаловать в StackOverflow.

2. выполнение, запуск?

3. Я считаю tableView.dequeueReusableCell , что возвращает nil , если ваш TableView начинался с 0 ячеек. В этом случае вам нужно сначала инициализировать UITableViewCell .

Ответ №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()
}