我是个新手。
我想在http响应回调后移到另一个新的ViewController。
我尝试过..
具有segue或委托协议
当我在情节提要板上创建序列时(使用ctrl按钮并拖动)
移动到另一个ViewController比http响应回调更快。
因此响应数据不会显示在新的ViewController上
带有InstantiateViewController()和present()函数
“在非主线程上否”的错误
class RequestViewController: UIViewController {
...
@IBAction func requestButtonTouchUpInside(_ sender: UIButton) {
http.post("/v1/request", jsonBody) { (response) -> () in
print(response)
// I want to move to another ViewController with response here
}
}
}
有解决方案吗?
谢谢。
答案 0 :(得分:3)
@IBAction func requestButtonTouchUpInside(_ sender: UIButton) {
http.post("/v1/request", jsonBody) { (response) -> () in
DispatchQueue.main.async {
performSegue(withIdentifier: "goToOtherVC", sender: self)
}
}
}
或
@IBAction func requestButtonTouchUpInside(_ sender: UIButton) {
http.post("/v1/request", jsonBody) { (response) -> () in
DispatchQueue.main.async {
let vc = OtherViewController()
self.present(vc, animated: true)
}
}
}
顺便说一句,我建议您在闭包中使用[weak self]
,为避免内存泄漏,您可以在Swift Docs中阅读更多内容
答案 1 :(得分:2)
由于必须始终从主线程进行UI更改,因此必须使用DispatchQueue.main.async来执行UI更改。
DispatchQueue.main.async {
//Your code to present or push to next View Controller
}
答案 2 :(得分:0)
出现“在非主线程上否”错误,因为您正在从后台线程更新UI。您需要从主线程更改UI。
@IBAction func requestButtonTouchUpInside(_ sender: UIButton) {
http.post("/v1/request", jsonBody) {[weak self](response) -> () in
DispatchQueue.main.async {
let nextVC = NextViewController()
self?.present(nextVC,animated: true)
}
}
}