L'envoi d'un bloc vers la file d'attente principale est généralement effectué à partir d'une file d'attente d'arrière-plan pour signaler qu'un traitement d'arrière-plan est terminé, par ex.
- (void)doCalculation
{
//you can use any string instead "com.mycompany.myqueue"
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.mycompany.myqueue", 0);
dispatch_async(backgroundQueue, ^{
int result = <some really long calculation that takes seconds to complete>;
dispatch_async(dispatch_get_main_queue(), ^{
[self updateMyUIWithResult:result];
});
});
}
Dans ce cas, nous effectuons un long calcul dans une file d'attente en arrière-plan et nous devons mettre à jour notre interface utilisateur lorsque le calcul est terminé. La mise à jour de l'interface utilisateur doit normalement être effectuée à partir de la file d'attente principale. Nous envoyons donc un signal à la file d'attente principale en utilisant un deuxième dispatch_async imbriqué.
Il existe probablement d'autres exemples où vous pourriez vouloir renvoyer la file d'attente principale, mais cela se fait généralement de cette manière, c'est-à-dire imbriqué dans un bloc envoyé à une file d'attente en arrière-plan.
- traitement en arrière-plan terminé -> mise à jour de l'interface utilisateur
- un morceau de données traité dans la file d'attente en arrière-plan -> signal à la file d'attente principale de commencer le morceau suivant
- données réseau entrantes dans la file d'attente d'arrière-plan -> signalent à la file principale que le message est arrivé.
- etc etc
Quant à la raison pour laquelle vous pourriez vouloir distribuer vers la file d'attente principale de la file d'attente principale... En général, vous ne le feriez pas, bien qu'il soit concevable que vous le fassiez pour planifier un travail à faire la prochaine fois dans la boucle d'exécution.
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í