1

Je commence avec Swift3 et j'ai un problème récurrent en raison de l'asynchronisme. Mais jusqu'à présent, je trouve toujours une solution avec rappel.Devrait exécuter segue sur demande

J'ai un textField et un bouton, quand je clique sur le bouton, je vérifie sur l'API s'il y a un utilisateur existant nommé comme dans le textField.

En utilisant shouldPerformSegue, je renvoie la valeur si les utilisateurs existent ou non.

J'ai une classe séparée pour le traitement des appels sur la Api

class Api { 
    static let urlApi = "https://XXXXXXXXXXXXX" 
    private let CUSTOMER_ID = "XXXXXXXX" 
    private let CUSTOMER_SECRET = "XXXXXXXX" 

    private var access_token : String? = nil 

    private var userInfo : User? 

    init() { 
     self.connect() 
    } 

    func connect() { 
     // Do the connect... 
    } 

    func get(user: String, callback: @escaping (_ status: Bool) -> Void) { 
     Alamofire.request(URL(string: "\(Api.urlApi)/v2/users/\(user)")!, 
          method: .get, 
          parameters: nil, 
          encoding: URLEncoding.default, 
          headers: ["Authorization": "Bearer \(self.access_token!)"]) 
      .responseJSON(completionHandler: { response in 
       if response.result.isFailure { 
        print("ERROR: GET USER", response) 
        callback(false) 
       } else { 
        print("SUCCESS Getting user ", user) 
        callback(true) 
       } 
      }) 
    } 
} 

Et dans mon shouldPerformSegue

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool { 
    var userExist : Bool? = nil 
    let dispatchQueue = DispatchQueue(label: "getUser") 
    let semaphore = DispatchSemaphore(value: 1) 

    dispatchQueue.sync { 

     self.api?.get(user: self.userTextField.text!, callback: { status in 
      userExist = status 
      print("1 USEREXIST", userExist) 
     }) 
    } 
    semaphore.wait() 
    print("2 USEREXIST", userExist) 
    return userExist ?? false // always false because userExist == nil 
} 

Désolé pour le désordre de la fonction, je ne trouve pas vraiment la bonne façon de faire mon DispachQueue et mon Semaphore .. Toutes les réponses googling regarder que j'ai besoin de ceux

Répondre

2

La bonne façon de gérer ce scénario serait être de faire la demande lorsque l'utilisateur appuie sur le bouton. S'il y a une erreur, vous présenterez une erreur indiquant que le nom d'utilisateur existe déjà. Ensuite, ils essaieraient à nouveau.

Si la demande aboutit et que le nom d'utilisateur n'a pas été saisi, vous appelez le performSegueWithIdentifier. Le lien ci-dessous montre une bonne démonstration des étapes à suivre après cela. Votre implémentation actuelle n'est pas nécessaire.

https://stackoverflow.com/a/37823730/653839

+0

Ok pour cela, mais pour le savoir, comment le faire comme je voudrais d'abord? –

+0

@ ale-batt Vous n'avez pas publié ce que les résultats de vos relevés d'impression génèrent, donc je ne pourrais pas vous le dire. Si l'utilisateur existe, alors vous voudriez retourner false, donc techniquement votre logique est incorrecte pour l'instruction return. – jnewkirk

+0

éditer! la première impression n'apparaît jamais –