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)
这将解决您的以下要求.
{
(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作为参数的方法,该方法可以执行您想做的任何操作返回值,然后从完成处理程序调用该方法。
| 归档时间: |
|
| 查看次数: |
14056 次 |
| 最近记录: |