23

Sto provando a creare un array sincronizzato (di rete) per la società per cui lavoro. Mentre la parte di rete funziona bene, ho soffermato su un problema.Coda seriale FIFO tramite GCD

Il mio desiderio era quello di creare una nuova coda utilizzando dispatch_create_queue, a cui vorrei aggiungere due blocchi che sono non per l'esecuzione sul thread principale, ma in maniera seriale, il che significa che prima del primo blocco deve correre, poi il secondo e mai in parallelo.

Ho letto la documentazione della mela, ma a dir poco è fonte di confusione.

  • Quando creo la mia coda utilizzando dispatch_queue_create e quindi aggiungere i blocchi (dopo che sono stati definiti) utilizzando dispatch_sync, ho scoperto che il blocco è ancora in esecuzione sul thread principale.

  • Quando si utilizza dispatch_async, questo è quando i blocchi non sono in esecuzione sul thread principale.

  • Quando provo ad aggiungere entrambi i blocchi utilizzando dispatch_sync Vengono bloccati per sempre.

  • L'unica volta che entrambi i blocchi sembrano funzionare correttamente e fuori dal thread principale è quando si chiama dispatch_async.

Tuttavia il motivo per cui ho scelto GCD e il metodo di sincronizzazione in modo che l'impressione che creavo una nuova coda (e quindi un nuovo thread) e che l'aggiunta di blocchi per quella coda avrebbe semplicemente bloccare uno fino a quando l'altro ha finito di eseguire. Non è questo il caso, o la creazione di una coda non garantisce che il codice non venga eseguito sul thread principale?

risposta

50

Si tratta di una coda FIFO in GCD:

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

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

dispatch_async(serialQueue, ^{ 
    //block2 
}); 
+0

Quindi non ha niente a che fare con dispatch_sync allora? Solo la bandiera utilizzata durante la sua creazione? –

+5

Il dispatch_async fa in modo che la chiamata di dispatch non blocchi fino a quando il blocco non è finito. Se si utilizza dispatch_sync, l'attività stessa viene eseguita in qualsiasi thread in cui si trova la coda, ma si blocca il thread corrente fino al completamento dell'attività. Non penso che sia quello di cui hai bisogno. –

+0

Grazie, quei nomi api sono un po 'confusi. Ho salvato la mia giornata! :) –

Problemi correlati