2
votes

Passer à un autre ViewController après le rappel de réponse http

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 ..


  1. 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


  1. 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.


1 commentaires

Utilisez l'option 2 mais exécutez-la sur la file d'attente principale.


3 Réponses :


2
votes

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
}


0 commentaires

3
votes
@IBAction func requestButtonTouchUpInside(_ sender: UIButton) {

    http.post("/v1/request", jsonBody) { (response) -> () in

        DispatchQueue.main.async { 
            let vc = OtherViewController()
            self.present(vc, animated: true)
        }
    }
}

1 commentaires

J'ai utilisé votre deuxième option et cela fonctionne parfaitement. Je vous remercie.



0
votes

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)
               }
            }
        }


0 commentaires