0

Je me demandais comment quelqu'un chargerait plusieurs éléments d'interface utilisateur de manière asynchrone. Dans mon cas, j'ai un UIViewController qui a un UISegmentControl. Chaque segment a différents aspects de l'interface utilisateur à charger.
Par exemple seg1 montre une image, et l'image seg2 montre et texte, etc.Chargement de plusieurs vues asynchrones dans swift

Si je charge tous les éléments de l'interface utilisateur avant d'afficher le UIViewController alors il y a un décalage notable. Donc, je voudrais charger seg2...n de manière asynchrone pour rendre l'interface utilisateur plus sensible.

Est-ce que je dois charger tout via

DispatchQueue.main.async { 
    // load UI 
} 

Pour chaque seg je veux charger en arrière-plan? Ou puis-je charger ces éléments sur un autre thread et ne pas prendre le fil principal? Je sais que vous n'êtes pas censé mettre à jour l'interface utilisateur sur les threads d'arrière-plan ... Mais l'utilisation du thread principal bloquera-t-elle toujours l'interface utilisateur si j'utilise du code asynchrone?

+0

L'appel simple de "DispatchQueue.main.asyn" prend simplement cette fermeture et la place à la fin de la file d'attente ... si vous avez une opération de longue durée/durée indéterminée, vous bloquerez toujours l'interface graphique. Vous aurez simplement attendu quelques millisecondes supplémentaires pour le faire. N'est-il pas possible de prendre les différentes ressources qui sont la vraie cause du temps supplémentaire, et de les gérer sur un thread d'arrière-plan? Essayez de définir la qualité de service (qualité de service à haute valeur pour aider). – BonanzaDriver

+0

Oh je vois. Utilisez le profileur pour voir ce qui prend du temps et le faire en arrière-plan? – uti0mnia

Répondre

0

Vous ne pouvez pas modifier l'interface utilisateur sur un thread d'arrière-plan. Presque tous les appels UIKit doivent être effectués sur le thread principal. Par conséquent, vous avez probablement de la chance. Au lieu de faire ce que vous devez faire est le fastidieux traitement de nombres (téléchargement et analyse de données par exemple) sur un thread d'arrière-plan, puis utilisez DispatchQueue.main.async() pour installer les données dans vos vues sur le thread principal Une fois le travail de longue haleine terminé.

Si le réglage de l'interface utilisateur introduit le décalage et qu'il n'est pas possible de l'accélérer, vous risquez de ne pas avoir de chance.