我必须用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重新加载新数据。
您希望在主线程上同时调用checkInstalledApps
和listOfApps.reloadData()
(使用DispatchQueue.main.async {}
)。
同时保持listOfApps.delegate = self
和listOfApps.dataSource = self
在viewDidLoad
中。
关于ios - Swift-URLSession任务中的TableView数据源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49052964/