从 URLSession 完成处理函数 Swift 3 返回字符串
Posted
技术标签:
【中文标题】从 URLSession 完成处理函数 Swift 3 返回字符串【英文标题】:Return String from URLSession Completion Handler function Swift 3 【发布时间】:2017-06-22 17:41:23 【问题描述】:我需要这个函数(它从数据库中获取一些数据)来返回一个字符串,但我无法弄清楚如何。我发现了一些类似的问题/解决方案,但我仍在努力实施适当的解决方案(我对 swift 很陌生)
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
谢谢!
【问题讨论】:
很接近骗子of this related question。 【参考方案1】:您的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")
【讨论】:
以上是关于从 URLSession 完成处理函数 Swift 3 返回字符串的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3,未调用 URLSession 数据任务完成处理程序
如何在从 Swift 3 中的函数返回结果之前等待 URLSession 完成
在 swift 3 中下载文件最多只能完成 24 kb?使用 URLSession