ios - 编程 .beginRefresh() 不刷新 UITableView 中的数据

标签 ios swift uitableview alamofire

在我的 TableViewController 中,我有一个使用 Alamofire 获取数据的 @objc 函数.当用户下拉触发拉刷新时,该函数由 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 会正确重新加载,但当使用编程方式调用拉取刷新时则不会。

最佳答案

正如 Paul 在评论中提到的,这是因为 UI 更新必须在主线程上分派(dispatch)。

Alamofire 是异步的,在后台线程上运行。话虽如此,您的 Alamofire 请求中的所有代码都将在后台线程上执行。

为了在主线程上执行代码,请使用以下内容:

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

关于ios - 编程 .beginRefresh() 不刷新 UITableView 中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53799095/

相关文章:

ios - disconnect() 已弃用 : Please use the shouldEstablishDirectChannel property instead

ios - 检测点击包含多个部分的 UITableView 的 UITableViewCell 中的按钮

ios - 在表格 View 中滚动后,选中标记会更改

ios - 如何通过添加自定义 header 字段和参数来发出 HEAD 请求?

ios - 如何设置 UINavigationBar 的标题?

iphone - 如何将带有参数的 block 传递给方法

Swift:如何使这个函数通用

ios - 仅允许从 UITextField 中选择和复制不起作用

ios - AudioKit 的 RenderToFile 无法正常工作

ios - 编辑 tableview Swift 的行高