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
Ok pour cela, mais pour le savoir, comment le faire comme je voudrais d'abord? –
@ 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
éditer! la première impression n'apparaît jamais –