Swift从URLSession返回数据

Cra*_*0ek 10 httprequest ios swift3 urlsession

我无法从HTTPrequest返回数据,也无法使完成处理程序工作.所以请帮助我解决这个问题:

public static func createRequest(qMes: message, location: String, method: String) -> String{
    let requestURL = URL(string: location)
    var request = URLRequest(url: requestURL!)

    request.httpMethod = method
    request.httpBody = qMes.toString().data(using: .utf8)

    let requestTask = URLSession.shared.dataTask(with: request) {
        (data: Data?, response: URLResponse?, error: Error?) in

        if(error != nil) {
            print("Error: \(error)")
        }

        return String(data: data!, encoding: String.Encoding.utf8) as String!
    }
    requestTask.resume()
}
Run Code Online (Sandbox Code Playgroud)

它在void函数中检测非void返回语句.在这一点上,我很无能为力......

Abi*_*ian 17

您可以使用此完成块方法发送最终响应:

对于Instance: 我在完成块中返回了String,成功响应后没有错误只是在块中传递结果.

  public func createRequest(qMes: String, location: String, method: String , completionBlock: @escaping (String) -> Void) -> Void
    {

        let requestURL = URL(string: location)
        var request = URLRequest(url: requestURL!)

        request.httpMethod = method
        request.httpBody = qMes.data(using: .utf8)

        let requestTask = URLSession.shared.dataTask(with: request) {
            (data: Data?, response: URLResponse?, error: Error?) in

            if(error != nil) {
                print("Error: \(error)")
            }else
            {

                let outputStr  = String(data: data!, encoding: String.Encoding.utf8) as String!
                //send this block to required place
                completionBlock(outputStr!);
            }
        }
        requestTask.resume()
    } 
Run Code Online (Sandbox Code Playgroud)

您可以使用以下代码执行上述完成块功能:

 self.createRequest(qMes: "", location: "", method: "") { (output) in

        }
Run Code Online (Sandbox Code Playgroud)

这将解决您的以下要求.


Jim*_*Jim 5

{
    (data: Data?, response: URLResponse?, error: Error?) in

    if(error != nil) {
        print("Error: \(error)")
    }

    return String(data: data!, encoding: String.Encoding.utf8) as String!
}
Run Code Online (Sandbox Code Playgroud)

这部分代码是该dataTask()方法的完成处理程序。这是一段代码,您将其传递dataTask()给稍后要执行的方法(当服务器发回一些数据或出现错误时)。它不会立即执行。

这意味着当createRequest()上面的方法正在执行时,它会直接传递该代码,然后传递到该requestTask.resume()行,然后该方法结束。此时,因为您的方法被定义为返回 a String,所以您需要返回 a String。从完成处理程序返回它是不好的,因为它尚未执行,稍后将执行。

处理异步编程有很多不同的方法,但解决这个问题的一种方法是更改​​您的createRequest()方法,使其不被定义为返回 a String,创建一个将 aString作为参数的方法,该方法可以执行您想做的任何操作返回值,然后从完成处理程序调用该方法。