gpt4 book ai didi

ios - Swift 4 向 URLRequest 完成处理程序添加参数

转载 作者:搜寻专家 更新时间:2023-11-01 06:57:16 27 4
gpt4 key购买 nike

我正在尝试从 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,而是将请求中的一些值传递回我的 View Controller 中的数组。

这些是我用来获取我想要的 JSON 片段的结构:

struct TopStoriesResponse: Decodable {
let status: String
let results: [Story]
}

struct Story: Decodable {
let title: String
let abstract: String
let url: String
}

我最终尝试用解析后的 JSON 在我的 View Controller 中填充这些数组,以便我可以将它们排列在 TableView 中:

var headlines = [String]()
var abstracts = [String]()
var urls = [URL]()

编辑:完整代码以防我在其他地方出错:https://pastebin.com/r402GKej

最佳答案

尝试从 ViewController 中单独创建结构 TopStoriesResponseStory 并添加 Networking 结构以从 API 加载数据

struct TopStoriesResponse: Decodable {
let status: String
let copyright: String
let num_results: Int
let results: [Story]
}

struct Story: Decodable {
let title: String
let abstract: String
let url: String
}

struct Networking {

static 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, error) in

guard let data = data, error == nil else {
print(error!.localizedDescription)
return
}

do {
let response: TopStoriesResponse = try JSONDecoder().decode(TopStoriesResponse.self, from: data)
print(response.results.count)
completionHandler(true)
} catch {
print(error.localizedDescription)
completionHandler(false)
}
}.resume()
}
}

现在尝试从 ViewController 调用 Networking.getJson

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
loadData()
}

func loadData() {
Networking.getJson { (result) in
print(result)
}
}
}

关于ios - Swift 4 向 URLRequest 完成处理程序添加参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52855022/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com