我必须用TableView获取的一些数据填充URLSession task。源文件是一个XML文件,因此我将其解析为任务。解析的结果是一个数组,我将它传递给另一个函数,该函数填充TableView Delegates使用的另一个数组。
我的问题是TableView Delegates是在任务结束之前调用的,所以当我启动应用程序时,表是空的,除非重新加载数据(所以我知道解析和任务工作正常)。
这里是viewDidLoad函数。listOfApps是我的TableView

    override func viewDidLoad() {

            super.viewDidLoad()

            fetchData()
            checkInstalledApps(apps: <ARRAY POPULATED>)

            listOfApps.delegate = self
            listOfApps.dataSource = self

        }
    }

fetchData是一个函数,我从中获取XML文件并对其进行解析
    func fetchData() {
        let myUrl = URL(string: "<POST REQUEST>");
        var request = URLRequest(url:myUrl!)
        request.httpMethod = "POST"
        let postString = "firstName=James&lastName=Bond";
        request.httpBody = postString.data(using: String.Encoding.utf8);

        let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in

            self.parser = XMLParser(data: data!)
            self.parser.delegate = self

        }
        task.resume()

    }

checkInstalledApps是组成TableView Delegates使用的数组的函数。
    func checkInstalledApps(apps: NSMutableArray){
    ....
    installedApps.add(...)
    installedApps.add(...)
    ....
    }

例如,要设置我计数的行数installedApps元素
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if (installedApps.count == 0) {
        noApp = true
        return 1
    }
    return installedApps.count
}

那是0。显然,如果我重新加载数据,一切都会好的。
我的问题是异步调用:首先,我使用了一个可以通过GET请求访问的XML,因此我可以使用XMLParser(contentsOf: myUrl),时间不是问题。也许如果XML能够发展起来,我也会遇到一些麻烦,但是现在我必须使用POST请求
我试过用一个
DispatchGroup之前
group.enter()之后
super.viewDidLoad之后
其中组是group.leave(),但没有。
那么,如何告诉tableview委托等待任务响应和下一个函数?
提前谢谢

最佳答案

我会忘记DispatchGroup,并改变这里的思维方式(在响应出现之前,您不想冻结UI)。
我相信您可以让fetchData实现保持原样。
XMLParserDelegate.parserDidEndDocument(_:)中,您将收到XML已被解析的通知。在该方法中,调用checkInstalledApps来填充模型数据。之后,只需调用listOfApps.reloadData()告诉tableView重新加载新数据。
您希望在主线程上同时调用checkInstalledAppslistOfApps.reloadData()(使用DispatchQueue.main.async {})。
同时保持listOfApps.delegate = selflistOfApps.dataSource = selfviewDidLoad中。

关于ios - Swift-URLSession任务中的TableView数据源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49052964/

10-12 00:25
查看更多