Le processus typique serait d'envoyer de manière asynchrone avec async
à une file d'attente de série. Alors, disons que vous voulez une file d'attente pour le traitement des images, en faisant la tâche A et la tâche B, puis faire des mises à jour de l'interface utilisateur lorsque la tâche B est fait, vous pourriez faire:
let queue = DispatchQueue(label: Bundle.main.bundleIdentifier! + ".images")
queue.async {
// do task A
}
queue.async {
// do task B
}
queue.async {
// do whatever else is needed after B here
DispatchQueue.main.async {
// update model objects and UI here
}
}
Ceci est un modèle qui évite le blocage la file d'attente principale, mais vous permet de vous assurer que vous faites A et B en série.
Veuillez noter que si la tâche A ou la tâche B sont elles-mêmes asynchrones, cela ne fonctionnera pas. (Ne pas essayer d'utiliser sync
, si la tâche sous-jacente était asynchrone.) D'autres modèles s'appliqueraient dans ces cas. Mais votre exemple est trop générique et il y a trop d'autres modèles possibles pour que nous les énumérions tous. Si vous nous dites précisément ce que font les tâches A et B, nous pourrions offrir des conseils plus constructifs.
Notez également que je déconseille explicitement de répartir de manière synchrone (avec sync
). Utiliser sync
a un certain attrait intuitif, mais c'est rarement la bonne approche. Le fait de bloquer le thread appelant (ce que fait sync
) annule en grande partie l'objectif d'avoir une file d'attente de répartition en premier lieu. La raison (en grande partie) que vous devez utiliser sync
est si vous essayez d'avoir un accès sécurisé aux threads à certaines ressources partagées. Mais la plupart du temps, vous utilisez explicitement les files d'attente d'expédition dans le but d'obtenir une tâche fastidieuse du thread en cours. Ainsi, envoyez A et B async
à la file d'attente série, et si vous vouliez faire quelque chose d'autre, C, ensuite, vous enverriez cette async
à la même file d'attente, aussi.
Pour une description, voir Concurrency Programming Guide: Dispatch Queues. Les exemples sont en Objective-C, mais tous les concepts sont les mêmes. Vous pouvez également aller à WWDC videos et rechercher "GCD", et vous obtiendrez un certain nombre de vidéos géniales qui passent par Grand Central Dispatch (le terme générique pour les technologies de file d'attente d'expédition).
"Tâche B démarrer après la tâche A" L'une après l'autre = Série. Donc vous voulez un DispatchQueue en série (c'est la valeur par défaut). Voulez-vous bloquer en attendant que A et B se terminent, ou voulez-vous les envoyer de manière asynchrone, et faire reprendre votre programme sans attendre leur fin? – Alexander
@Alexander Oui, c'est ce dont j'ai besoin et je veux que l'autre code attende les tâches A et B puisque les tâches A et B rassemblent toutes les données requises pour tout autre codage. –
Alors vous voulez soumettre vos tâches de manière synchrone ('.sync'), pas asynchrone (' .async') – Alexander