简体   繁体   English

使用 completionHandler 制作一个 Swift 5 函数来打印 JSON 数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM