Swift从URLSession返回数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift从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()
}
它在void函数中检测非void返回语句。在这一点上,我很无能为力......
您可以使用此完成块方法发送最终响应:
对于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()
}
您可以使用以下代码执行上述完成块功能:
self.createRequest(qMes: "", location: "", method: "") { (output) in
}
这将解决您的以下要求。
{
(data: Data?, response: URLResponse?, error: Error?) in
if(error != nil) {
print("Error: (error)")
}
return String(data: data!, encoding: String.Encoding.utf8) as String!
}
这部分代码是dataTask()
方法的完成处理程序。这是一段代码,你传递给dataTask()
方法以便稍后执行(当服务器发回一些数据或者有错误时)。它没有立即执行。
这意味着当上面的createRequest()
方法正在执行时,它会直接传递到该代码,然后传递到requestTask.resume()
线上,然后方法结束。那时,因为你的方法被定义为返回一个String
,你需要返回一个String
。从完成处理程序返回它并不好,因为它尚未执行,稍后将执行。
有许多不同的方法来处理异步编程,但解决这个问题的一种方法是更改你的createRequest()
方法,以便它不被定义为返回String
,创建一个方法,将String
作为参数,做任何你想做的事情使用返回值,然后从完成处理程序中调用该方法。
而不是使用return,尝试使用您在问题中提到的完成处理程序。
func createRequest(qMes: message, location: String, method: String, completionHandler: @escaping (_ data:Data?, _ response: URLResponse?, _ error: NSError?) -> Void)
然后你应该使用像return
这样的东西而不是completionHandler(data, response, error)
这就是你提出要求的方式:
var request = URLRequest(url: Foundation.URL(string: URL)!)
request.httpMethod = method
//request.addValue(authString, forHTTPHeaderField: "Authorization") // if you need some
let task = URLSession.shared.dataTask(with: request, completionHandler: { data, response, error in
guard error == nil && data != nil else
{
print("error=(error)")
completionHandler(data, response, error as NSError?)
return
}
completionHandler(data, response, error as NSError?)
})
task.resume()
只是在你的函数调用中
var webString = try String(contentsOf: URL(string: url)!)
你有完整的字符串响应,你可以返回
以上是关于Swift从URLSession返回数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 URLSession 将数据获取到 PHP 方法 - swift
如何在从 Swift 3 中的函数返回结果之前等待 URLSession 完成
Swift:如何在异步 urlsession 函数中返回一个值?
Swift:如何在异步 urlsession 函数中返回一个值?