首页 > 解决方案 > 尝试通过 URLSession 的完成处理程序返回数据

问题描述

我希望有人能提供帮助,我已经尝试了几个教程,我想我已经接近完成这项工作了。

我定义了一个结构,称为 Patient。它包含数十个键:值对,与来自 JSON 响应的信息相同。我可以在 Xcode 的控制台中打印此响应,它看起来不错。我想要做的是用 JSON 数据填充结构并通过完成处理程序返回它以用于应用程序的其余部分。

我不断绊倒的地方是返回填充的结构,下面的代码在完成块所在的位置给了我错误:

“无法将 '(Patient).Type' 类型的值转换为预期的参数类型 'Patient'”

我怀疑我只是很困惑,我错过了一些明显的东西。非常感谢任何帮助我完成此操作的帮助。

代码:

import Foundation

func getReturnA(doneStuffBlock: @escaping (Patient) -> Void) {

    var patient: [Patient] = []

    // set up URL request
    guard let url = URL(string: "http://***.***.***.***/backend/returnA") else {
        print("Can't create URL")
        return 
    }
    let urlRequest = URLRequest(url: url)

    // set up the session
    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)

    // make the request
    let task = session.dataTask(with: urlRequest) { (data, response, error) in
        guard let data = data else {
            print("Did not recieve data")
            return
        }
        do {
            let decoder = JSONDecoder()
            let patient = try decoder.decode(Array<Patient>.self, from: data)
            print(patient.self)
        } catch let err {
            print("Err", err)
        }
        doneStuffBlock(Patient)
    }
    task.resume()
}

标签: swifturlsession

解决方案


两个问题:

  1. 完成处理程序中的类型应该是一个数组

    func getReturnA(doneStuffBlock: @escaping ([Patient]) -> Void) {
    
  2. 区分大小写很重要(类型Patient与变量名称patient)。
    建议以复数形式命名一个表示数组的变量,并在出错时返回一个空数组。

    var patient: [Patient] = []

    ...
    
    do {
        let decoder = JSONDecoder()
        let patients = try decoder.decode(Array<Patient>.self, from: data)
        print(patients)
        doneStuffBlock(patients)
    } catch {
        print("Err", error)
        doneStuffBlock([])
    }
    

推荐阅读