146 votes

iPhone - Fil conducteur de Grand Central Dispatch

J'ai utilisé avec succès Grand Central Dispatch dans mes applications, mais je me demandais quel était le réel avantage d'utiliser quelque chose comme ça :

dispatch_async(dispatch_get_main_queue(), ^{ ... do stuff

ou même

dispatch_sync(dispatch_get_main_queue(), ^{ ... do stuff

Je veux dire que dans les deux cas, vous déclenchez un bloc qui doit être exécuté sur le thread principal, exactement là où l'application s'exécute, et cela n'aidera pas à réduire la charge. Dans le premier cas, vous n'avez aucun contrôle sur le moment où le bloc sera exécuté. J'ai vu des cas où des blocs étaient exécutés une demi-seconde après que vous les ayez lancés. Dans le second cas, c'est similaire à

[self doStuff];

n'est-ce pas ?

Je me demande ce que vous en pensez.

9 votes

Au fait, lancer une file d'attente principale dans un dispatch_sync entraînera un blocage.

5 votes

Je viens de le lire dans la docs : "Contrairement à dispatch_async, [dispatch_sync] ne revient pas avant la fin du bloc. L'appel de cette fonction et le ciblage de la file d'attente actuelle entraînent un blocage"... Mais peut-être que je lis cela mal... (la file d'attente actuelle ne signifie pas le thread principal). Veuillez corriger si je me trompe.

4 votes

@BrooksHanes pas toujours vrai. Il en résultera une impasse si vous êtes déjà sur le fil principal. Sinon, il n'y aurait pas d'impasse. Voir aquí

0voto

Esq Points 498

Async signifie asynchrone et vous devriez l'utiliser la plupart du temps. Vous ne devez jamais appeler sync sur le thread principal car cela bloquera votre interface utilisateur jusqu'à ce que la tâche soit terminée. Il existe une meilleure façon de faire cela en Swift :

runThisInMainThread { () -> Void in
    // Run your code like this:
    self.doStuff()
}

func runThisInMainThread(block: dispatch_block_t) {
    dispatch_async(dispatch_get_main_queue(), block)
}

Il est inclus comme une fonction standard dans mon repo, vérifiez-le : https://github.com/goktugyil/EZSwiftExtensions

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X