#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()
}