从URLSession完成处理函数返回字符串Swift 3
问题描述:
我需要这个函数(它从数据库获取一些数据)返回一个字符串,但我很难弄清楚如何。我已经发现了一些类似的问题/解决方案,但我仍然在努力实现一个妥善的解决办法(我很新与SWIFT)从URLSession完成处理函数返回字符串Swift 3
class Helper{
static func pReq(jsonURL : String, col : String) -> String {
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
let url = URL(string: jsonURL)!
let request = URLRequest(url: url)
var string = ""
let downloadTask = session.dataTask(with: request, completionHandler: {(data, response, error) in
if(error == nil){
print("data = \(String(describing: data))")
do{
print(jsonURL)
let dataDownloadedAsJson = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:AnyObject]
print("dataDownloadedAsJson = \(dataDownloadedAsJson)")
do{
if(dataDownloadedAsJson[col] as? String != nil){
string = (dataDownloadedAsJson[col] as? String)!
}
}
}
catch{
}
}
else{
print("Error downloading data. Error = \(String(describing: error))")
}
})
downloadTask.resume()
return string
}
}
谢谢!
答
您的session.dataTask(with:
方法是异步的。这意味着它将在“后台”中执行,并通知您何时完成调用的响应。它会在“{}
”内的session.dataTask(with:
部分下方的块内通知您。就好像出现了,您正在使用您接收的JSON进行一些处理,并将其格式化为您希望从此函数返回的字符串。 但是在呼叫完成之前,您的呼叫被称为return string
,因此您将返回""
。你真正需要做的是不是从你的函数返回任何东西,而是使用一个完成块:
1)声明此之上你的文件:
typealias StringCompletion = (_ success: Bool, _ string: String) -> Void
2)修改函数取您完成
// This
static func pReq(jsonURL : String, col : String) -> String
// Becomes This
static func pReq(jsonURL : String, col : String, completion: @escaping StringCompletion)
3)内,您的函数中的参数调用您的完成和回传一Bool
,以指示它是一个成功的呼叫,并通过回string
以及
class Helper{
static func pReq(jsonURL : String, col : String, completion: @escaping StringCompletion) {
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
let url = URL(string: jsonURL)!
let request = URLRequest(url: url)
var string = ""
let downloadTask = session.dataTask(with: request, completionHandler: {(data, response, error) in
if(error == nil){
print("data = \(String(describing: data))")
do{
print(jsonURL)
let dataDownloadedAsJson = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:AnyObject]
print("dataDownloadedAsJson = \(dataDownloadedAsJson)")
do{
if(dataDownloadedAsJson[col] as? String != nil){
string = (dataDownloadedAsJson[col] as? String)!
completion(true, string)
}
}
catch { completion(false, string) }
}
catch{
completion(false, string)
}
}
else{
print("Error downloading data. Error = \(String(describing: error))")
completion(false, string)
}
})
downloadTask.resume()
}
}
4)用途:
Helper().pReq(jsonURL: jsonURL, col: col) { (success, string) in
if success {
print("Success: \(string)")
}
else {
print("Failure: Unable To Get String")
}
}
相当接近[此相关的问题的一种重复数据删除(HTTPS:/ /*.com/questions/24647406/how-to-use-completionhandler-closure-with-return-in-swift)。 –