2017-04-11 6 views
0

J'utilise une API de repos pour me connecter J'envoie simplement une demande avec l'adresse e-mail et le mot de passe de l'utilisateur. Si elles correspondent dans la base de données, je retourne un peu Json et swift l'analyse. Cette partie fonctionne correctement ce que j'essaie de faire maintenant est de comprendre comment je peux alerter un utilisateur si l'email et le mot de passe ne correspondent pas. Jusqu'à présent, je suis arrivé ceIOS Swift Comment puis-je retourner la réponse de l'étiquette plus rapidement?

@IBAction func Login_Action(_ sender: Any) { 
     var check = 0 
     let url:URL = URL(string:ConnectionString+"login")! 
     let Email = email.text! 
     let Password = password.text! 
     let session = URLSession.shared 
     var request = URLRequest(url: url) 
     request.httpMethod = "POST" 
     request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData 
     let parameter = "email=\(Email)&password=\(Password)" 
     request.httpBody = parameter.data(using: String.Encoding.utf8) 

     session.dataTask(with:request, completionHandler: {(data, response, error) in 
      if error != nil { 
       // print(error) 
      } else { 
       do { 
     // if the call is successful then it goes through here otherwise it skips it 
        check = 1 


        let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:Any] 




         } 
         DispatchQueue.main.async { 

      // send them to member page    
         let next = self.storyboard?.instantiateViewController(withIdentifier: "NextView") 
          self.present(next, animated: true, completion: nil) 

         } 


        } 

       } catch let error as NSError { 
        print(error) 
        if check == 0 { 
       self.error.isHidden = false 
       self.error.text = "Incorrect email and/or password" 
      } 
       } 


      } 
     // If the call is unsuccessful then show message 

      return 
     }).resume() 
     /* 
     print(check) 
     if check == 0 { 
      self.error.isHidden = false 
      self.error.text = "Incorrect email and/or password" 
      print("incorrect") 
     }*/ 


    } 

J'utilise la variable de contrôle comme le drapeau, il est par défaut est 0. Ce qui signifie que la combinaison e-mail/mot de passe ne fonctionne pas et si la combinaison e-mail/mot de passe fonctionne, je la mets à 1. Le problème est qu'il faut environ 5 ou 7 secondes pour afficher le message incorrect e-mail et/ou mot de passe si l'utilisateur a fourni les informations d'identification incorrectes. Lorsque je vérifie le temps de réponse d'un appel, il revient immédiatement, mais il faut environ 7 secondes pour que l'étiquette s'affiche. Si je mets cette même logique en dehors de la .resume alors il apparaît instantanément mais le message est toujours incorrect email et mot de passe si le chèque ou non est 0 ou 1 des suggestions serait mieux

+1

Hey Rome, pls améliorer votre formatage du code - il est très difficile de le lire tel quel, merci! Aussi: gardez à l'esprit que 'guard' est votre ami :-) –

+1

Vous devez montrer les informations sur les détails de connexion incorrects * à l'intérieur de la fermeture *, tout comme vous le faites avec la présentation de la scène suivante. N'oubliez pas d'envoyer la mise à jour de l'interface utilisateur dans la file d'attente principale. – Paulw11

+0

Merci Paulo et oh ok Paulw le fera maintenant –

Répondre

1
  self.error.isHidden = false 
      self.error.text = "Incorrect email and/or password" 

Ces lignes sont le gestionnaire d'achèvement, mais n'a pas été envoyé à la file d'attente principale. Le bloc d'achèvement s'exécute sur une file d'attente d'arrière-plan. Vous ne pouvez pas modifier les composants de l'interface utilisateur dans une file d'attente autre que la file d'attente principale. Si vous le faites, parfois cela fonctionnera, mais le symptôme que vous voyez (longs délais) est l'un des nombreux problèmes que vous pouvez rencontrer. Déplacez-les dans un DispatchQueue.main.async comme vous l'avez fait dans le bloc do.