【发布时间】:2020-05-03 04:53:26
【问题描述】:
我有以下 Swift 5 函数在我的服务器上调用 PHP 脚本:
func getJSONdata(fileName:String, completion: (_ json:JSON)->()) {
let session = URLSession(configuration: .ephemeral)
var jsonData = JSON()
let myUrl = URL(string: DATABASE_PATH + fileName + "/query.php?queryAll");
var request = URLRequest(url:myUrl!)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
DispatchQueue.main.async {
let task = session.dataTask(with: request) { (data, response, error) in
if error != nil {
print("\(error!.localizedDescription)")
return
}
// Get data
jsonData = try! JSON(data: data!)
// print(jsonData)
}
task.resume()
}// ./ dispatch aync
completion(jsonData)
}
此函数托管在一个单独的 Swift 文件中,现在在我的 ViewController.swift 中,我按如下方式调用该函数:
getJSONdata(fileName: "Users") { (jsonData) in
print("\(jsonData)")
}
在这种情况下,我在我的 Xcode 控制台中得到一个空数组,相反,如果我取消注释我的 getJSONdata() 函数中的 // print(jsonData),控制台会打印出我的 JSON 数据。
显然我在 getJSONdata() 函数中做错了,因为我无法通过调用 ViewController.swift 来检索数据。
我的函数中的错误在哪里?
【问题讨论】:
-
如果将
completion(jsonData)移动到jsonData = try! JSON(data: data!)下会发生什么 -
您应该在从 API 获得响应/数据后调用完成处理程序。
-
好的,但这是我得到的:i.postimg.cc/g0gz2wvy/error.png
-
谢谢@chirag90,你说得对,我还必须将 @escaping 添加到我的函数声明中。