【发布时间】:2020-07-21 15:06:07
【问题描述】:
我想从 JSON Data 中的数据创建 TableView,但是当我尝试获取该值时,它总是在第二次打印时返回 nil。 你能解释一下并给我一些关于这个问题的建议吗? 在问这个问题之前我已经很努力了,但我真的很陌生:(
最好的问候,
import UIKit
struct News: Decodable {
var status:String
var totalResults:Int
var articles:[Articles]?
}
struct Articles: Decodable{
var source:Source?
var title:String?
var description:String?
var urlToImage:String?
var publishedAt:String?
}
struct Source: Decodable{
var name:String?
}
class NewsViewController: UIViewController{
var a = [String]()
@IBOutlet weak var TableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
//Hit API
let url = URL(string: "http://newsapi.org/v2/top-headlines?country=th&category=technology&apiKey=2b27ab9b590041a6a6dcdf4ef94a0a33")
URLSession.shared.dataTask(with: url!) { (data, response, error) in
if error == nil {
do {
let result = try JSONDecoder().decode(News.self,from: data!)
let totalresult = result.articles!.count
for result in result.articles!{
let titleUnWrapped: String = result.title ?? ""
let urlToImageUnWrapped: String = result.urlToImage ?? ""
self.a.append(titleUnWrapped)
// print(self.a) <<<<<<<<<<<<<<<<<<<<<<<<< Work
}
} catch {
print("ERROR")
}
}
}.resume()
print(self.a) //Return nil <<<<<<<<<<<<<<<<<<<<<<<<< Not Work
}
}
【问题讨论】:
-
您的第二个打印语句在您的 api 调用之后立即执行,但在该 api 调用检索数据并完成之前 - 所以它仍然是空的。仅在检索到数据后才调用完成闭包内的打印语句,从而显示正确的结果。 api 调用是异步的,所以它会继续执行它的工作,但不会阻塞代码的执行流程,因此在
a仍然为空时执行第二个打印语句。 -
非常感谢 Magnas 的建议!,另一个问题是我怎样才能让它等到完全检索到数据然后调用第二个函数所以它不返回 nil?我已经尝试过 dispatchgroup 但它似乎对我不起作用:(