Программный .beginRefresh () не обновляет данные в UITableView - PullRequest
0 голосов
/ 16 декабря 2018

В моем TableViewController у меня есть функция @objc, которая извлекает данные, используя Alamofire .Функция вызывается refreshController, когда пользователь нажимает на кнопку, чтобы запустить обновление по запросу.

Обновление по запросу объявляется так:

let refreshControl = UIRefreshControl()
tableView.refreshControl = refreshControl
self.refreshControl!.addTarget(self, action: #selector(refresh(sender:)), for: .valueChanged)

И функция, которую он запускает:

@objc func refresh(sender:AnyObject) {
    let defaults = UserDefaults.standard
    if let mode = defaults.string(forKey: defaultsKeys.mode) {
        self.mode = mode
    }
    self.tableData.removeAll()
    print(mode)
    Alamofire.request(mode).response { response in
        let xml = SWXMLHash.config {
            config in
            config.shouldProcessLazily = true
            }.parse(response.data!)
        for elem in xml["rss"]["channel"]["item"].all {
            self.tableData.append(elem["title"].element!.text)
        }
        print("Completed Data Gather")
        self.mainTable?.reloadData()
        self.refreshControl!.endRefreshing()
    }
}

Проблема возникает, когда я пытаюсь вызвать функцию автоматического обновления по запросу, используя

self.refreshControl!.beginRefreshing()
self.refreshControl!.sendActions(for: .valueChanged)

Функция выполняется (как это наблюдается в консоли из-за операторов печати), и данные извлекаются,но tableView отказывается обновлять.Я знаю, что данные извлекаются правильно, потому что в следующий раз, когда пользователь вручную извлекает обновления tableView с новыми данными.

TL; DR Мой tableView правильно перезагружается, когда пользователь вручную вытягивает обновления,но не тогда, когда обновление по запросу вызывается программно с помощью.

1 Ответ

0 голосов
/ 16 декабря 2018

Как упомянул Пол в комментариях, это связано с тем, что обновления пользовательского интерфейса должны отправляться в основной поток.

Alamofire работает асинхронно и работает в фоновом потоке.При этом весь код в вашем запросе Alamofire будет выполняться в фоновом потоке.

Чтобы выполнить код в основном потоке, используйте следующее:

DispatchQueue.main.async {
    // Update UI ie. self.mainTable?.reloadData()
}
...