【问题标题】:Method to return value retrieved from HTTP request [duplicate]返回从 HTTP 请求中检索到的值的方法 [重复]
【发布时间】:2019-04-26 03:42:11
【问题描述】:

我有一个执行 HTTP 请求并从网站检索数据的方法,它按预期工作,我正在正确获取数据。我无法做的是在调用方法时返回检索到的值。

这里是代码...

func myFunction(zipCode: String)->String{
    var myData:String = ""

    let siteLink = "http://example.com/zip/" + zipCode
    let url = URL(string: siteLink)

    let task = URLSession.shared.dataTask(with: url!) { data, response, error in
        guard error == nil else {
            print(error!)
            return
        }
        guard let data = data else {
            print("Data is empty")
            return
        }
        let json = try! JSONSerialization.jsonObject(with: data, options: [])
        guard let jsonArray = json as? [[String: String]] else {
            return
        }
        myData = jsonArray[0]["MyPropertyName"]!
        // Here, myData outputs, "Info for zip code 52484 from HTTP request"
    }

    task.resume()

    return myData
}

当我调用 myFunction 时,我得到一个空字符串...

myFunction(zipCode: "52484")// Outputs an empty string

我期望看到的是"Info for zip code 52484 from HTTP request" 的返回值,因为myData 变量在返回调用之前在let task = 内被修改。我尝试在 let task = 中返回,但这不能在 Swift 中完成。

调用myFunction时如何返回检索到的值?

【问题讨论】:

    标签: swift return return-value nsurlsession


    【解决方案1】:

    你需要一个完成,因为请求是异步的

    func myFunction(zipCode: String,completion:@escaping(_ str:String?) -> () ) {
    
        let siteLink = "http://example.com/zip/" + zipCode
        let url = URL(string: siteLink)
    
        let task = URLSession.shared.dataTask(with: url!) { data, response, error in
            guard error == nil else {
                print(error!)
                completion(nil)
                return
            }
            guard let data = data else {
                print("Data is empty")
                completion(nil)
                return
            }
            let json = try! JSONSerialization.jsonObject(with: data, options: [])
            guard let jsonArray = json as? [[String: String]] else {
                completion(nil)
                return
            }
            let myData = jsonArray[0]["MyPropertyName"]!
            completion(myData) 
        } 
        task.resume() 
    }
    

    打电话

    myFunction(zipCode: "52484") { (str) in 
      if let st = str {
        print(st)
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-24
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多