Je suis un débutant rapide.
Je souhaite passer à un autre nouveau ViewController après le rappel de réponse http.
J'ai essayé de ..
avec protocole segue ou délégué
Lorsque j'ai créé une séquence sur le storyboard, (avec le bouton Ctrl et faites glisser)
le passage à un autre ViewController est plus rapide que le rappel de réponse http.
donc les données de réponse ne sont pas affichées sur le nouveau ViewController
avec la fonction instantiateViewController () et present ()
Erreur avec "NON sur le thread non principal"
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
}
}
}
Une solution?
Merci d'avance.
3 Réponses :
Vous devez utiliser DispatchQueue.main.async pour effectuer des modifications d'interface utilisateur car les modifications d'interface utilisateur doivent toujours être effectuées à partir du thread principal.
DispatchQueue.main.async {
//Your code to present or push to next View Controller
}
@IBAction func requestButtonTouchUpInside(_ sender: UIButton) {
http.post("/v1/request", jsonBody) { (response) -> () in
DispatchQueue.main.async {
let vc = OtherViewController()
self.present(vc, animated: true)
}
}
}
J'ai utilisé votre deuxième option et cela fonctionne parfaitement. Je vous remercie.
L'erreur "NON sur le thread non principal" s'est produite car vous mettez à jour votre interface utilisateur à partir du thread d'arrière-plan. Vous devez changer l'interface utilisateur du thread principal.
@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)
}
}
}
Utilisez l'option 2 mais exécutez-la sur la file d'attente principale.