[英]Make a Swift 5 function with completionHandler to print JSON data
I have the following Swift 5 function that calls a PHP script on my server:我有以下 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)
}
This function is hosted in a separate Swift file, now in my ViewController.swift I call that function as follows:这个函数托管在一个单独的 Swift 文件中,现在在我的ViewController.swift 中我调用这个函数如下:
getJSONdata(fileName: "Users") { (jsonData) in
print("\(jsonData)")
}
In this case, I'm getting an empty array in my Xcode console, instead, if I uncomment the // print(jsonData)
that's inside my getJSONdata()
function, the console prints out my JSON data.在这种情况下,我在 Xcode 控制台中得到一个空数组,相反,如果我取消注释getJSONdata()
函数内的// print(jsonData)
,控制台会打印出我的 JSON 数据。
Obviously I'm doing something wrong in my getJSONdata()
function because I cannot retrieve data by calling in ViewController.swift .显然我在getJSONdata()
函数中做错了,因为我无法通过调用ViewController.swift来检索数据。
Where is the error in my function?我的函数中的错误在哪里?
Try the below code.试试下面的代码。 Maybe it will help you.也许它会帮助你。
func getJSONdata(fileName:String, completion:@escaping (_ 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)")
completion(nil)
}
// Get data
jsonData = try! JSON(data: data!)
// print(jsonData)
completion(jsonData)
}
task.resume()
}
}
I've found a solution, I don't know why but if I add @escaping
to my function declaration, it works fine.我找到了一个解决方案,我不知道为什么,但是如果我将@escaping
添加到我的函数声明中,它就可以正常工作。
I also had to move completion(jsonData)
below jsonData = try! JSON(data: data!)
我还必须将completion(jsonData)
移动到jsonData = try! JSON(data: data!)
jsonData = try! JSON(data: data!)
, as suggested by @chirag90. jsonData = try! JSON(data: data!)
,如@chirag90 所建议。
So, here's the complete function:所以,这是完整的功能:
func getJSONdata(fileName:String, completion: @escaping (_ json:JSON?) -> Void) {
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 {
self.simpleAlert("\(error!.localizedDescription)")
return
}
// Get data
jsonData = try! JSON(data: data!)
completion(jsonData)
}
task.resume()
}// ./ dispatch aync
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.