Asynchrone/synchrone
Rocou
Membre
Bonjour,
Dans mon application en SwiftUI pour MacOS, j'ai une méthode me permettant de récupérer l'adresse IP de la machine du réseau sur laquelle tourne un serveur PostgreSQL.
Mon problème est que l'application tente de se connecter au serveur avant que l'adresse IP ait été récupérée.
Je ne sais pas comment traiter ce problème.
- J'ai essayé en appelant la méthode dans applicationDidFinishLaunching
- Avec des DispatchQueue.main.async
- Avec des async et await
- Un ProgressView
Mais rien à faire. Parfois, sur ma machine de développement sur laquelle tourne la base PostegreSQL, la récupération de l'adresse IP est plus rapide et cela fonctionne mais sur une autre machine du réseau, rien à faire, ça ne fonctionne pas, la récupération est trop lente.
Je dois me planter quelque part mais où ?...
Le côté asynchrone est vraiment ma bête noire...
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Bonjour,
Peut-être avec :
func perform(
_ aSelector: Selector,
with anArgument: Any?,
afterDelay delay: TimeInterval
)
Salut,
D'après ta description il faut d'abord récupérer l'adresse IP, puis se connecter au serveur. Ce ne sont donc pas des opérations asynchrones entre-elles, elles ne peuvent pas se faire en parallèle. Et en même temps, il ne faut pas non plus qu'elles bloquent le thread principal (interface utilisateur) de l'appli.
Avec async/await ça donnerait quelque chose comme ça:
(il faut plus comprendre le principe que l'implémentation exacte).
La difficulté ne vient pas tant de l'asynchronisme que de la manière de passer les données entre les threads.
Mon exemple est assez abstrait, aussi n'hésite pas à donner du code pour que nous puissions t'aider d'avantage.
Si je comprends bien le problème, ton app ne peut pas tourner tant que tu n'as pas récupérer l'adresse, c'est ça ?
Dans ce cas, mets un écran pour ça. C'est le plus simple.
Et seulement une fois que l'adresse a été récupérer, tu peux naviguer dans ton app.
Merci pour vos pistes.
Bon, j'ai l'impression que cette fois, ça fonctionne. J'avais pourtant l'impression d'avoir déjà testé cette configuration...
Voici le code:
la connexion :
La classe :
la fonction pour se connecter à la base:
Concernant la fonction de recherche de l'adresse IP du serveur PostgreSQL, je la trouve assez merdique et probablement dangereuse. Si quelqu'un sait comment réaliser cela en swift pur, je suis preneur...
J'avais testé sans y parvenir: une vue avec un progressView en attendant de recevoir l'IP. Cependant, la confection tentait malgré tout de se faire avant d'avoir reçu l'IP.
Ah, le serveur PostgreSQL tourne en local? Je n'ai pas vraiment d'idée pour faire mieux, et puis ça dépasse mes compétences.