【发布时间】:2018-03-01 15:23:35
【问题描述】:
我必须用URLSession task 获取的一些数据填充TableView。源是一个 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()在task.resume()之后 -
group.wait()在checkInstalledApps()之后
其中组是let group = DispatchGroup(),但什么都没有。
那么,我如何告诉 tableview 委托等待任务响应和下一个函数?
提前致谢
【问题讨论】:
标签: ios swift uitableview asynchronous