Ce code ci-dessous est-il garanti pour exécuter dans l'ordre si c'est sur le même thread? Sinon, est-il moyen de vous assurer que les tâches d'arrière-plan asynchrones sont effectuées dans l'ordre?
4 Réponses :
si vous devez les exécuter en série, alors les chaînez-les un après le autre ou crée une file d'attente de série personnalisée et expédiez les tâches en tant que p> DispatchQueue.global () code> est une file d'attente simultanée qui signifie que toutes les tâches de 2 fonctionnent en parallèle quelconque 1 extrémise le premier
Où n'est pas nécessaire de verrouiller le fil où vous avez initialisé le Dispatchqueue pendant que la file d'attente est en série. SerialQueue.Async {...} aura le même résultat de ne pas verrouiller le fil parent
2 questions supplémentaires basées votre commentaire. 1: Si j'utilise la même étiquette, est-ce suffisant pour fonctionner dans l'ordre ou dois-je stocker le DispatchQueue avec étiquette et l'utiliser ailleurs? 2: Comme il s'agit d'un fil séparé, puis-je supposer qu'il ne bloquera pas le fil principal, tel que UI?
@dtardails 1- Chaque file d'attente varie ses propres tâches en série afin que vous ayez créé 2, n'attendez pas un ordre de série entre leurs tâches distinctes 2- sûr que cela ne bloque pas le fil principal.
@Dmitriy à l'intérieur de la file d'attente créée en réponse Aucune différence entre Sync code> et
async code> fonctionnera en série et n'affectera pas le fil principal de toute façon
@ Sh_khan, appeler Sync verrouille toujours le fil parent pendant son exécution. Sync (Exécutez :) "Contrairement à Dispatch_Async (: < / i> :), cette fonction ne revient pas tant que le bloc n'est pas terminé ".
Faites-les simplement dans le même code ASYNC.
Vous pouvez créer votre opérationQueue avec une opération simultanée en même temps et tout Qo dont vous avez besoin comme ceci: afin que vous puissiez utiliser n'importe quelle qualité de service et il est garanti de fonctionner dans l'ordre. Vous le transmettez à l'intérieur de la file d'attente de fonctionnement mais non garantie en ordre. p> p>
Dispatchqueue est un niveau d'abstraction au-dessus d'un thread réel. L'avantage de ceci est que Apple peut essentiellement décidé si un thread de système d'exploitation réel est nécessaire en fonction de quelques facteurs: P>
Par conséquent, le GCD donne essentiellement le système d'exploitation la possibilité de créer un thread s'il voit que comme étant efficace pour l'expérience utilisateur et le matériel, l'application s'allume. P>
à la fin, avec la méthode Vous pouvez en savoir plus sur Comment chaque API fonctionne en relation au développement asynchrone ici. Il existe spécifiquement une section sur le GCD qui concentre les différents drapeaux et types de files d'attente. P> .Async code> Chaque opération sera
Si vous voulez qu'ils courent une à la fois, créez une file d'attente série.
ASYNC CODE> Les tâches commenceront dans la commande leur formidable, mais sur des files d'attente de répartition simultanées, elles progresseront simultanément et termineront dans une commande non définie.
Si je veux un code qui ne bloque pas l'interface utilisateur, puis-je simplement exécuter sur certains Dispatchqueue (étiquette: "A"). Synchroniser?