web-dev-qa-db-fra.com

FIFO File d'attente série à l'aide de GCD

J'essaie de créer un tableau (réseau) synchronisé pour la société que je travaille. Bien que la partie de réseau fonctionne bien, je suis habité dans un problème.

Mon souhait était de créer une nouvelle file d'attente à l'aide de dispatch_create_queue, À laquelle j'ajouterais deux blocs qui sont pas à exécuter sur le fil principal, mais de manière sérieuse, ce qui signifie que d'abord le Le premier bloc doit exécuter, puis le second, et jamais en parallèle.

J'ai lu le Apple Documentation, mais il est déroutant de dire le moins.

  • Lorsque je crée ma file d'attente à l'aide de dispatch_queue_create, Puis ajoutez les blocs (après avoir été définis) à l'aide de dispatch_sync, J'ai découvert que le bloc est toujours exécuté sur le fil principal.

  • Lorsque vous utilisez dispatch_async, Telle que lorsque les blocs ne sont pas exécutés sur le fil principal.

  • Lorsque j'essaie d'ajouter les deux blocs en utilisant dispatch_sync Ils sont bloqués pour toujours.

  • La seule fois que les deux blocs semblent courir bien et que le thread principal est lorsque vous appelez dispatch_async.

Cependant, la raison pour laquelle j'ai choisi GCD et la méthode de synchronisation de sorte que j'avais l'impression que je créais une nouvelle file d'attente (et donc un nouveau fil) et que l'ajout de blocs à cette file d'attente bloque simplement une jusqu'à ce que l'autre avait fini d'exécuter. N'est-ce pas le cas ou la création d'une file d'attente ne garantit pas que le code ne fonctionnera pas sur le fil principal?

29
Ælex

Ceci est un FIFO File d'attente dans GCD:

dispatch_queue_t serialQueue = dispatch_queue_create("com.blah.queue", DISPATCH_QUEUE_SERIAL);

...
dispatch_async(serialQueue, ^{
    //block1
});

dispatch_async(serialQueue, ^{
    //block2
});
60
Fernando Mazzon