Est-il possible d'accéder à un DispatchGroup d'une autre classe? Dire que j'ai la fonction suivante dans la classe Loginfunctions.swift
(avec un var loginQueue = DispatchGroup.init()
défini sur la func
):Accéder à DispatchGroup depuis une autre classe
func logUserIn(emaila: String!, passworda: String!, urlPath: String!, completionHandler:@escaping (NSDictionary) -> Void) {
DispatchQueue.global(qos: .userInitiated).async {
let requestURL = NSURL(string: urlPath)!
let request = NSMutableURLRequest(url: requestURL as URL)
request.httpMethod = "POST"
let emailtext = emaila
let passwordtext = passworda
let postParameters = "email="+emailtext!+"&password="+passwordtext!;
request.httpBody = postParameters.data(using: .utf8)
DispatchGroup.enter(loginQueue)()
//creating a task to send the post request
let task = URLSession.shared.dataTask(with: request as URLRequest) {
data, response, error in
if error != nil{
print("error is \(error)")
return;
}
do {
//converting resonse to NSDictionary
let myJSON = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSDictionary
DispatchGroup.wait(self.loginQueue)()
DispatchQueue.main.async {
completionHandler(myJSON)
}
} catch {
print(error)
}
}
//executing the task
task.resume()
DispatchGroup.leave(self.loginQueue)()
}
}
Appeler les éléments suivants d'une autre classe (LoginViewController.swift
) donne lieu à des valeurs différentes pour TEMP_VAR_FOR_LOGIN
(instance en LoginViewController.swift
):
@IBAction func userLogin(_ sender: UIButton) {
self.loginFunctions.logUserIn(emaila: self.email.text, passworda: self.password.text, urlPath: "URL_PATH_WAS_ENTERED_HERE") {
(completionHandler) in
self.TEMP_VAR_FOR_LOGIN = completionHandler
print("*****************")
print(self.TEMP_VAR_FOR_LOGIN)
}
print("################")
print(TEMP_VAR_FOR_LOGIN)
}
La sortie de la console est
Some other stuff...
#################
{
}
More other stuff...
*****************
{
The Data I need : Out of the Closure
}
Toute aide où le problème est?
P.S. Rookie ici;)
Il y a beaucoup d'erreurs dans votre utilisation de 'DispatchGroup' ici – KrishnaCA
@KrishnaCA Je crois que vous: D Pouvez-vous me aider où exactement? – Omep2005
Chaque appel de 'DispatchGroup.enter()' doit être équilibré par 'DispatchGroup.leave()' lorsque l'appel asynchrone est terminé. Vous appelez 'DispatchGroup.leave()' avant même que la tâche soit terminée ici. Pouvez-vous s'il vous plaît me dire exactement ce que vous essayez de résoudre ici? Essayez-vous d'utiliser DispatchGroup.notify() quelque part? Si oui, où et quel est le but? – KrishnaCA