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

标签 ios swift

我正在尝试从 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/

相关文章:

ios - 前台本地通知

swift - 协议(protocol)数组元素是按值传递还是按引用传递?

swift 快速枚举选项

ios - SwiftUI ScrollViewReader scrollTo 未按预期工作

ios - 在页脚按钮上单击表格 View 不会重新加载表格的内容?

ios - 在不中断背景媒体播放的情况下录制音频

ios - 等价于 Flutter 中的 viewWillAppear()

javascript - IOS 上的 xmlhttprequest 不发送请求?

swift - 另一个 View Controller 中属性的内联 KVO

swift - 在 Combine 中,您如何创建一个发送一个值但永远不会完成的发布者?