因为我可以等待服务器返回结果然后再执行另一个函数(它将使用来自服务器响应的数据)。
类似的东西:
Func A:我从服务器得到响应:responseCode = 200,它存储在一个变量" code" 功能B:检查变量"代码"是200。
我找不到方法,到目前为止,我总是在运行之前运行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
答案 0 :(得分:3)
您可以使用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")
}
}
答案 1 :(得分:0)
你需要将func_b放在func_a
的闭包中...
if httpStatus!.statusCode == 200
{
self.responseCode = httpStatus!.statusCode
print("Step 3")
self.func_b
}
这样一旦返回代码,func_b就会运行。您可以了解有关互联网闭包的更多信息。我建议this video作为开始
答案 2 :(得分:0)
function一个异步执行的任务,它不会等待tasks.so的结果 使用下面的主线程
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代码一样使用完成处理程序