Salut, bon déjà c’est super que tu sois arrivé si loin
Ensuite on est dimanche il est 6h30 du coup ne m’en tiens pas rigueur si tu ne comprends pas mes explications lol.
Ce message risque d’être un peu long car je vais te donner une façon de faire pour la gestion asynchrone de tes petits problèmes . Sache qu’il y a beaucoup de façons de faire et que j’en prend une qui te permettra de comprendre d’autre concept plus tard. Il s’agit des Notifications.
Je m’explique une notification c’est simplement un message qu’envoi une classe A (ou autre chose) pour dire (le plus souvent) j’ai fini cette opération (ou autre).
Le truc c’est quelle le cris sur tous les “toits”.
Et de l’autre coté tu as d’autres classes qui écoutent pour voir quand la classe A a fini de faire la fameuse opération, du coup quand elles entendent “j’ai fini” elles peuvent lancer leurs opérations.
En gros une classe “dispache un event” et d’autres “l’écoutent”.
Maintenant je vais faire un pseudo code simple pour que tu puisses l’adapté.
Ma classe qui envoie le message :
import Foundation
import Alamofire
// les notifications sont messages qu'on envoie il doit être unique dans le monde d'apple du coup le mieux comme c'est des String c'est de les prefixer par le bundle de l'App
let errorServerNotificationID = "com.exemple.mon_app.errorServerNotificationID"
let errorResponseRequestANotificationID = "com.exemple.mon_app.errorResponseRequestANotificationID"
let okResponseRequestANotificationID = "com.exemple.mon_app.okResponseRequestANotificationID"
class A {
func requestA() {
Alamofire.request("ton URL et tout tes parametres").responseString { (response) in
switch response.result {
case .success:
//Attention un success ne veux pas dire qu'il s'agit bien de la réponse que tu attendais mais que le server a répondu. Il ne s'est pas planté donc dans un success il faut vérifier si la réponse est celle que tu attendais.
/*Attention dans ton cas les deux reponses :
* <ROOT><CODE>1</CODE><RETOUR>OK</RETOUR></ROOT>
*<ROOT><CODE>1</CODE><RETOUR>ERR5</RETOUR></ROOT>
sont dans le success*/
if "ma réponse est celle que j'attendais" {
//ici de fait des instructions peuvent s’exécuter
//j'envois ma notification de success
NotificationCenter.default.post(name: Notification.Name(rawValue: okResponseRequestANotificationID), object: self)
} else {
//ici de fait des instructions peuvent s’exécuter
//j'envois ma notification d'erreur
NotificationCenter.default.post(name: Notification.Name(rawValue: errorResponseRequestANotificationID), object: self)
}
case .failure(let error):
//ici de fait des instructions peuvent s’exécuter
//j'envois ma notification d'erreur serveur
NotificationCenter.default.post(name: Notification.Name(rawValue: errorServerNotificationID), object: self)
}
}
}
}
Petite truc : Comme tu peux le voir j’ai mis les notifications en variable globale à l’extérieur de la classe pour quelle soit accessible dans toute l’application mais tu pourrais les mettre dans une classe statique. Le but étant quelles soient accessible par toutes les classes qui vont écoutées et envoyées ses messages.
Maintenant la classe B qui va écouter le message (j’ai vue que tu voulais t’en servir dans ton viewcontroler donc je vais l’adapté au viewcontroler) :
import Foundation
import UIKit
import Alamofire
class ViewController: UIViewController {
//MARK: - DESTRUCTOR
//attention toujours detruire les ecouteurs pour eviter les fuites mémoires quand tu crées un ecouteur tu le détruit dans le destructeur de la classe ou il a été créer.
deinit {
NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: errorServerNotificationID), object: nil)
NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: errorResponseRequestANotificationID), object: nil)
NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: okResponseRequestANotificationID), object: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
//Je vais creer 1 seul ecouteur par message à eccouter par classe ici car ma vue est chargé correctement du coup je sais qu'a se moment la si j'entend que la RequestA de la s'est exécuter je peux faire des choses
// "#selector(didOkResponseRequestA)" veux dire que la methode qui va etre appel pour le message "rawValue: okResponseRequestANotificationID" est didOkResponseRequestA
NotificationCenter.default.addObserver(self, selector: #selector(didOkResponseRequestA), name: Notification.Name(rawValue: okResponseRequestANotificationID), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(didErrorServer), name: Notification.Name(rawValue: errorServerNotificationID), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(didErrorResponseRequestA), name: Notification.Name(rawValue: errorResponseRequestANotificationID), object: nil)
}
@objc private func didOkResponseRequestA(){
// je requestA est bien fini je fais ma requestB
requestB()
}
@objc private func didErrorServer(){
//j'ai eu une erreur serveur j'affiche un message d'erreur
}
@objc private func didErrorResponseRequestA(){
//j'ai eu une erreur par exemple car mes identifiant n'été pas bon j'affiche un message d'erreur
}
private func requestB() {
Alamofire.request("ton URL et tout tes parametres").responseString { (response) in
switch response.result {
case .success:
if "ma réponse est celle que j'attendais" {
//ici de fait des instructions peuvent s’exécuter d'autres notifs si besoin
} else {
//ici de fait des instructions peuvent s’exécuter d'autres notifs si besoin
}
case .failure(let error):
//ici de fait des instructions peuvent s’exécuter d'autres notifs si besoin
}
}
}
}
Voilà ce long message et surtout j’espère avoir été assez clair. Surtout que j’ai eu un petit plantage d’internet entre temps et qu’il est 8h20 lol, je vais me faire une bonne tasse de café .
Pour info il ne s’agit que d’une seule solution il y a beaucoup d’autre façon de gérer asynchrone.