Swift ios Канна данные возвращаются пустыми в первый раз в viewDidLoad - PullRequest
1 голос
/ 04 февраля 2020

Я пытаюсь загрузить данные из API в мой TableViewController, но при первой загрузке данные возвращаются пустыми. Я не могу построить таблицу, потому что данные пусты.

import UIKit
import Kanna

class TableViewController: UITableViewController {

var country = [String]()

override func viewDidLoad() {
    super.viewDidLoad()
    gets()
    print(country)// is empty view controller.
}
func gets(){

    let url = "https://site"
    let myURL = NSURL(string: url)
    let URLTask = URLSession.shared.dataTask(with: myURL! as URL) {
        myData, response, error in
        guard error == nil else {return}
        let myHTML = String(data: myData!, encoding: String.Encoding.utf8)
        DispatchQueue.global(qos: .userInitiated).async {
            if let doc = try? HTML(html: myHTML!, encoding: .utf8) {
                DispatchQueue.main.async {
                    for fdata in doc.xpath("//*[@id='content']/table[3]") {
                        let i = fdata.text!
                        self.country.append(i)
                    }
                }
            }
        }
    }
    URLTask.resume()
}

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

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

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel?.text = country[indexPath.row]
    return cell
}

Я знаю, что есть много подобных проблем. Я пробовал разные варианты, но мне это не удалось.

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

Нашел это! Используйте метод viewWillAppear (_animated: Bool), который вызывается до появления представления на экране.

override func viewWillAppear(_ animated: Bool) {
    gets()
}
0 голосов
/ 05 февраля 2020

Поскольку данные поступают из сетевого запроса, изначально таблица всегда будет пустой. Вы можете получить данные из предыдущего контроллера представления (отображающего какой-то индикатор загрузки) и подождать, чтобы представить его, пока выборка не будет завершена.

Или, если вы просто хотите перезагрузить таблицу, когда данные попробуйте добавить self.tableView.reloadData() после загрузки данных:

...
    DispatchQueue.main.async {
        for fdata in doc.xpath("//*[@id='content']/table[3]") {
            let i = fdata.text!
            self.country.append(i)
        }
        self.tableView.reloadData()
    }
...
...