Ios Swift 3-等待服务器结果
因为我可以等待服务器返回一个结果,然后执行另一个函数(将使用服务器响应中的数据) 比如: Func A:我从服务器得到响应:responseCode=200,它存储在变量“code”中 Func B:检查变量“code”是否为200 我找不到路,到目前为止,我总是在func B运行之前运行它 多谢各位Ios Swift 3-等待服务器结果,ios,swift,swift3,Ios,Swift,Swift3,因为我可以等待服务器返回一个结果,然后执行另一个函数(将使用服务器响应中的数据) 比如: Func A:我从服务器得到响应:responseCode=200,它存储在变量“code”中 Func B:检查变量“code”是否为200 我找不到路,到目前为止,我总是在func B运行之前运行它 多谢各位 @IBAction private func bt_signin () { print("Step 1") func_a(text: url_text) func_b()
@IBAction private func bt_signin () {
print("Step 1")
func_a(text: url_text)
func_b()
}
private func func_a(text: String) {
print("Step 2")
let url = NSURL(string: text)
let request = NSMutableURLRequest(url: url! as URL)
let task = URLSession.shared.dataTask(with: request as URLRequest){ data, response, error in
guard error == nil && data != nil else
{
print("Error: ", error)
return
}
let httpStatus = response as? HTTPURLResponse
if httpStatus!.statusCode == 200
{
self.responseCode = httpStatus!.statusCode
print("Step 3")
}
}
task.resume()
}
func func_b (){
print("Step 4")
if (responseCode == 200) {
print("Step 5")
}
}
我得到以下信息:
Step 1
Step 2
Step 4
Step 3
您需要将func_b放入func_a的闭包中
...
if httpStatus!.statusCode == 200
{
self.responseCode = httpStatus!.statusCode
print("Step 3")
self.func_b
}
这样,一旦返回代码,func_b就会运行。您可以在internet上了解有关闭包的更多信息。我建议您先开始您可以使用Closer来实现以下更改
@IBAction private func bt_signin () {
print("Step 1")
func_a(text: "") { (isSuccess) in
self.func_b()
}
}
private func func_a(text: String , _ completion:@escaping (_ isSuccess:Bool)->Void) {
print("Step 2")
let url = NSURL(string: text)
let request = NSMutableURLRequest(url: url! as URL)
let task = URLSession.shared.dataTask(with: request as URLRequest){ data, response, error in
guard error == nil && data != nil else
{
print("Error: ", error)
DispatchQueue.main.async {
completion(false)
}
return
}
let httpStatus = response as? HTTPURLResponse
if httpStatus!.statusCode == 200
{
self.responseCode = httpStatus!.statusCode
DispatchQueue.main.async {
completion(false)
}
print("Step 3")
}
}
task.resume()
}
func func_b (){
print("Step 4")
if (responseCode == 200) {
print("Step 5")
}
}
函数异步执行任务,它不会等待任务的结果。所以 使用主线程,如下所示
DispatchQueue.main.async {
if httpStatus!.statusCode == 200
{
self.responseCode = httpStatus!.statusCode
print("Step 3")
func_b() // here call wanna perform any UI updates
}
}
您也可以像@Irshad Ahmed code一样使用完成处理程序,“任务”是异步执行的(很容易解释,func_a将返回/完成,任务将继续在后台运行)。在任务内部调用self.func_b(),当检索到状态码并在Swift中读取了一点async时:)输出是正确的,
URLSession
work async所以funcB
将首先运行,你不能把func_b()放在
在步骤3
?您必须使用完成处理程序来处理此情况。非常感谢Irshad Ahmed,此解决方案按照我想要的方式工作。我将学习它以更好地理解它,因为我是Swift和iOS应用程序的初学者,我需要学习很多。再次感谢。谢谢格雷格,我是Swift和iOS应用程序的初学者,我需要学习很多。