【发布时间】:2018-10-17 12:36:21
【问题描述】:
我正在尝试从 Swift 4 中的 URLRequest 返回一些数据,为此我在我的函数签名中添加了一个完成处理程序,暂时只是使用 Bool。这是函数:
func getJson(completionHandler: @escaping (Bool) -> ()) {
let jsonUrlString = "https://api.nytimes.com/svc/topstories/v1/business.json?api-key=f4bf2ee721031a344b84b0449cfdb589:1:73741808"
guard let url = URL(string: jsonUrlString) else {return}
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data, err == nil else {
print(err!)
return
}
do {
let response = try
JSONDecoder().decode(TopStoriesResponse.self, from: data)
print(response.results)
// Pass results into arrays (title, abstract, url, image)
completionHandler(true)
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch let jsonErr {
print("Error serializing JSON", jsonErr)
}
}.resume()
}
我在viewDidLoad 中这样称呼它:
getJson { (success) in
print("Success")
}
没有任何东西打印到控制台,所以我想知道我是否正确使用了完成处理程序?但最终我想切换 Bool 并从请求中传递一些值,返回到我在视图控制器中拥有的数组中。
这些是我用来获取我想要的 JSON 片段的结构:
struct TopStoriesResponse: Decodable {
let status: String
let results: [Story]
}
struct Story: Decodable {
let title: String
let abstract: String
let url: String
}
我最终会尝试在我的视图控制器中使用解析后的 JSON 填充这些数组,以便我可以将它们排列在表格视图中:
var headlines = [String]()
var abstracts = [String]()
var urls = [URL]()
编辑:完整代码,以防我在其他地方出错:https://pastebin.com/r402GKej
【问题讨论】:
-
print(response.results)打印什么吗? -
不,它没有 - 我把那个放错地方了吗?
-
您说“没有任何东西打印到控制台。”您的任何打印语句都没有向控制台显示任何内容?在创建 dataTask 之前尝试添加打印语句。如果只是您的完成处理程序没有打印,那是因为您只在成功情况下调用完成处理程序。在失败案例中,您应该使用 false 值调用它。
-
@KingTim 否,但它表明该代码永远不会被执行。所以我猜数据是空的。
-
@DuncanC 在数据任务之前添加打印语句也不打印任何内容。现在我真的很困惑......也没有错误打印