我有以下代码:
func completeLoadAction(urlString:String) -> Int { let url = URL(string:urlString.trimmingCharacters(in: .whitespaces)) let request = URLRequest(url: url!) let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { // check for fundamental networking error print("error=\(error)") let ac = UIAlertController(title: "Unable to complete", message: "The load has been added to the completion queue. This will be processed once there is a connection.", preferredStyle: .alert) ac.addAction(UIAlertAction(title: "OK", style: .default)) self.present(ac, animated: true) return } let httpStatus = response as? HTTPURLResponse var httpStatusCode:Int = (httpStatus?.statusCode)! let responseString = String(data: data, encoding: .utf8) print("responseString = \(responseString)") let ac = UIAlertController(title: "Completed Successfully", message: "The "+coldel+" has been completed successfully", preferredStyle: .alert) ac.addAction(UIAlertAction(title:"Continue", style: .default, handler: { action in self.performSegue(withIdentifier: "segueConfirmedLoad", sender: self) })) self.present(ac, animated: true) } task.resume() return httpStatusCode }
我需要能够调用它,同时检查返回值,因为它是http状态代码,它将让我知道调用是否成功。
问题是因为它在dataTask中,我无法在此处访问响应状态代码
var httpStatusCode:Int = (httpStatus?.statusCode)!
因为只有在调用Task.Resume()并且任务是异步的之后任务才能开始,所以它将永远无法工作。
有什么办法解决吗?
总有一种使用异步模式的方法。
要使函数异步添加完成块
func completeLoadAction(urlString:String, completion: (Int) -> ()) { let url = URL(string:urlString.trimmingCharacters(in: .whitespaces)) let request = URLRequest(url: url!) let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { // check for fundamental networking error print("error=\(error)") DispatchQueue.main.async { let ac = UIAlertController(title: "Unable to complete", message: "The load has been added to the completion queue. This will be processed once there is a connection.", preferredStyle: .alert) ac.addAction(UIAlertAction(title: "OK", style: .default)) self.present(ac, animated: true) } completion(0) // or return an error code return } let httpStatus = response as? HTTPURLResponse var httpStatusCode:Int = (httpStatus?.statusCode)! let responseString = String(data: data, encoding: .utf8) print("responseString = \(responseString)") DispatchQueue.main.async { let ac = UIAlertController(title: "Completed Successfully", message: "The "+coldel+" has been completed successfully", preferredStyle: .alert) ac.addAction(UIAlertAction(title:"Continue", style: .default, handler: { action in self.performSegue(withIdentifier: "segueConfirmedLoad", sender: self) })) self.present(ac, animated: true) } completion(httpStatusCode) } task.resume() }
并这样称呼它
completeLoadAction(urlString: "www.something.com") { code in print(code) }