Retour de fonction qui contient une clôture avec lancement asynchrone

Bonjour à tous,

J’ai un peu de mal à faire passer le résultat d’une fonction d’un objet qui réalise une requête vers un webservice vers une autre classe qui fait l’interface avec Swift UI.

J’ai une vue en Swift UI qui va chercher à afficher une liste de donnée et qui déclenche le chargement de cette liste au démarrage :

La fonction appel un manager de données qui va lui même mobiliser un gestionnaire de requêtes :

Le gestionnaire de requête effectue la demande de manière asynchrone et c’est la où ça coince. Je ne sais pas comment faire en sorte que le retour de ma fonction se déclenche quand le gestionnaire a fini son travail. Le retour en fin de fonction se fait directement après la clôture sans attendre le résultat du webservice. Et si je met le return dans la clôture après traitement des données, il me dit que ma fonction n’a pas de retour valide. Si quelqu’un sait où ça coince … :slight_smile:

Bonjour,

Une suggestion en pseudo code:

if everythingIsOk {
self.discoveryList = downloadedDiscoveryResponse.results
return self.discoveryList 
} else {
return []
}

Cordialement,
Nicolas

Hello Nicolas,

C’est justement ce everythingIsOK que je ne sais pas matérialiser.

Une fois que la closure a fini son traitement, je ne sais pas comment mettre un top pour renvoyer le résultat.

Bonsoir,

Une autre manière de te dire où je vois un problème dans ton code:

  • ton bloc de code qui commence par let dataTask = … lance une action « longue »
  • mais pendant que cette action longue se traite, le programme continue, et trouve l’instruction
return self.discoverList

Comme l’action longue n’est pas encore terminée, ta fonction retourne systématiquement la valeur actuelle de discoverList, à savoir [].

Il te faut donc mettre les « return » dans des imbrications if…else…

Par exemple:

let dataTask = ...
guard error == nil etc... else { return []}
if httpResponse.statusCode == 200, let downloadedDiscoverResponse = ... {
self.discoverList = ...
return self.discoverList
} else {
return []
}

Je ne peux pas te garantir à 100% que ça va être OK, mais ça va déjà enlever une source d’erreur.

Cordialement,
Nicolas

Oui j’ai essayé. Ca permet de compiler mais aucune donnée ne remonte au discover manager … :grin:
On verra ça avec @mbritto pendant le coaching !
Merci de ton aide.

As tu mis un PRINT ou un log avant chaque return pour vérifier dans quelle boucle du if…else… tu te trouves ?