2017-04-19 4 views
0

J'ai un point de terminaison qui prend un numéro de téléphone et envoie un code au numéro, mais renvoie également ce même message à la section de données de la session qui l'a appelé. Tout cela fonctionne, mais le problème que je rencontre est que, après que la session ait passé l'appel, je passe à l'écran suivant et je passe ce code dans le contrôleur suivant. Mais je pense que l'api répond trop lentement, donc avec le temps le segue (et la préparation pour segue) est arrivé le code n'a pas encore été retourné. Comment puis-je réparer cela?afficher la réponse de URLSession

let scriptURL = "https://---------------/api/verify/sms?" 
    let urlWithParams = scriptURL + "number=\(phone.text!)" 
    let myUrl = NSURL(string: urlWithParams) 
    let request = NSMutableURLRequest(url: myUrl! as URL) 

    request.httpMethod = "GET" 
    let task = URLSession.shared.dataTask(with: request as URLRequest) { 
     data, response, error in 
     //print(error?.localizedDescription) 

     do { 
      let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as AnyObject 
      self.currentCode = json["code"]!! as! String //-> This is the code the is returned from the api call 

     }catch{ 
      print("error with serializing JSON: \(error)") 
     } 
    } 
    task.resume() 

    self.performSegue(withIdentifier: "toVerifyCode", sender: (Any?).self) 
} 

// MARK: - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
    if segue.identifier == "toVerifyCode"{ 
     let newController = segue.destination as! verifyCodeController 
     newController.code = self.currentCode 
    } 
} 
+0

Mettez le 'performSegue (withIdentifier' ligne ** dans ** le bloc d'achèvement – vadian

+0

Alors j'ai essayé cela et la même chose semble toujours se produire? –

+0

Le code est censé fonctionner Si la ligne est placée juste après le 'self.currentCode = json [...' ligne et bien sûr être enlevé après 'resume()'. Btw: passer juste 'nil' comme expéditeur et vous n'avez pas besoin de' URLRequest' quand vous utilisez 'GET'. – vadian

Répondre

0

Le problème est que vous avez placé self.performSegue(withIdentifier: "toVerifyCode", sender: (Any?).self) pas dans la fermeture.

Ainsi, vous devez placer comme ceci:

let task = URLSession.shared.dataTask(with: request as URLRequest) { 
     data, response, error in 
     //print(error?.localizedDescription) 

     do { 
      let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as AnyObject 

      //on main thread 
      DispatchQueue.main.async { 
       self.currentCode = json["code"]!! as! String //-> This is the code the is returned from the api call 
       self.performSegue(withIdentifier: "toVerifyCode", sender: (Any?).self) 
      } 

     }catch{ 
      print("error with serializing JSON: \(error)") 
     } 
    } 
    task.resume() 

En outre, s'il vous plaît noter que votre fermeture est exécuté de manière asynchrone, donc j'enroulai l'appel à être exécuté sur thread principal en utilisant GCD.

+0

Merci! Cela a fonctionné –

+0

@CesaSalaam Vous êtes les bienvenus. – Shmidt