无法及时 API 调用 运行 用于表视图 swift 4 xcode 9
Cannot get API call to run in time for tableview swift 4 xcode 9
我正在尝试调用 API 来填充列表视图的单元格,但似乎无法在生成单元格之前收集要收集的数据。我试过制作一个像 这样的完成处理程序,但没有成功,也尝试制作来自相同 link 的信号量。 completion handler编译的时候,执行的时候还是没有及时获取到数据(诚然,这是我第一次尝试completion handler)。这是原始代码 w/o 完成处理程序:
override func viewDidLoad() {
super.viewDidLoad()
RestaurantListView.delegate = self
RestaurantListView.dataSource = self
//API setup
guard let url = URL(string: "https://myURL.com") else {
print("ERROR: Invalid URL")
return
}
let task = URLSession.shared.dataTask(with: url) {
(data, response, error) -> Void in
// URL request is complete
guard let data = data else {
print("ERROR: Unable to access content")
return
}
guard let blog = try? JSONDecoder().decode(Blog.self, from: data) else {
print("Error: Couldn't decode data into Blog")
return
}
self.myData = blog
}
task.resume()
}
table 和单元格在这些函数下初始化:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 100
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = RestaurantListView.dequeueReusableCell(withIdentifier: "cell")
cell?.textLabel?.text = myAPIValue
return cell!
}
我有几个打印语句来跟踪程序,它通过 viewDidLoad 然后第一个 tableView 设置 table 然后第二个处理单元格,最后它通过URL 任务。
我已经用几十种不同的方式重写了它,但不知道如何让它以正确的顺序执行。
您需要重新加载 table ,因为此行 URLSession.shared.dataTask(with: url)
触发的异步任务与您的代码行的顺序不同
guard let blog = try? JSONDecoder().decode(Blog.self, from: data) else {
print("Error: Couldn't decode data into Blog")
return
}
self.myData = blog
DispatchQueue.main.async{
RestaurantListView.reloadData()
}
您必须将数据保存在变量中,如下所示,我使用了 arrayOfData。查看保存数据后调用的 reloadData() 函数。
func downloadData (){
let url = URL(string: "http://www.url.com")
if let url = url {
let task = URLSession.shared.dataTask(with: url, completionHandler: {(data, response, error) in
do {
if let dataResponse = data{
let responseDecoded = try JSONDecoder().decode(Response.self, from: dataResponse)
DispatchQueue.main.async {
self.arrayOfData = responseDecoded.results ?? []
self.RestaurantListView.reloadData()
}
}
}
catch {
print("Error: \(error)")
}
})
task.resume()
}
}
您必须使协议符合该数据
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
/**If you have no elements you should return 0**/
return arrayOfData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = RestaurantListView.dequeueReusableCell(withIdentifier: "cell"){
cell.textLabel?.text = arrayOfData[indexPath.row].name
return cell
}
return UITableViewCell()
}
我正在尝试调用 API 来填充列表视图的单元格,但似乎无法在生成单元格之前收集要收集的数据。我试过制作一个像
override func viewDidLoad() {
super.viewDidLoad()
RestaurantListView.delegate = self
RestaurantListView.dataSource = self
//API setup
guard let url = URL(string: "https://myURL.com") else {
print("ERROR: Invalid URL")
return
}
let task = URLSession.shared.dataTask(with: url) {
(data, response, error) -> Void in
// URL request is complete
guard let data = data else {
print("ERROR: Unable to access content")
return
}
guard let blog = try? JSONDecoder().decode(Blog.self, from: data) else {
print("Error: Couldn't decode data into Blog")
return
}
self.myData = blog
}
task.resume()
}
table 和单元格在这些函数下初始化:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 100
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = RestaurantListView.dequeueReusableCell(withIdentifier: "cell")
cell?.textLabel?.text = myAPIValue
return cell!
}
我有几个打印语句来跟踪程序,它通过 viewDidLoad 然后第一个 tableView 设置 table 然后第二个处理单元格,最后它通过URL 任务。
我已经用几十种不同的方式重写了它,但不知道如何让它以正确的顺序执行。
您需要重新加载 table ,因为此行 URLSession.shared.dataTask(with: url)
触发的异步任务与您的代码行的顺序不同
guard let blog = try? JSONDecoder().decode(Blog.self, from: data) else {
print("Error: Couldn't decode data into Blog")
return
}
self.myData = blog
DispatchQueue.main.async{
RestaurantListView.reloadData()
}
您必须将数据保存在变量中,如下所示,我使用了 arrayOfData。查看保存数据后调用的 reloadData() 函数。
func downloadData (){
let url = URL(string: "http://www.url.com")
if let url = url {
let task = URLSession.shared.dataTask(with: url, completionHandler: {(data, response, error) in
do {
if let dataResponse = data{
let responseDecoded = try JSONDecoder().decode(Response.self, from: dataResponse)
DispatchQueue.main.async {
self.arrayOfData = responseDecoded.results ?? []
self.RestaurantListView.reloadData()
}
}
}
catch {
print("Error: \(error)")
}
})
task.resume()
}
}
您必须使协议符合该数据
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
/**If you have no elements you should return 0**/
return arrayOfData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = RestaurantListView.dequeueReusableCell(withIdentifier: "cell"){
cell.textLabel?.text = arrayOfData[indexPath.row].name
return cell
}
return UITableViewCell()
}