尝试通过补全处理程序从URLSession返回数据

时间:2018-12-11 16:32:20

标签: swift urlsession

我希望有人可以提供帮助,我已经尝试了一些教程,并且我想将其付诸实践。

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

我一直不停地返回已填充的结构,下面的代码在完成块所在的位置给了我错误:

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

我怀疑我只是非常困惑,并且缺少明显的东西。我们将不胜感激。

代码:

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()
}

1 个答案:

答案 0 :(得分:1)

两个问题:

  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([])
    }