2015-02-27 15 views
5

Sto scrivendo uno script rapido da eseguire nel terminale che invia al thread in background un paio di operazioni. Senza ulteriori sforzi, dopo che il mio invio è stato completato, il codice raggiunge la fine del file e si chiude, uccidendo anche le mie operazioni in background. Qual è il modo migliore per mantenere in vita lo script rapido fino al termine delle operazioni in background?In attesa di chiamate asincrone in uno script rapido

Il meglio che ho trovato è il seguente, ma non credo che questo sia il modo migliore, o addirittura corretto.

var semaphores = [dispatch_semaphore_t]() 
while x { 
    var semaphore = dispatch_semaphore_create(0) 
    semaphores.append(semaphore) 
    dispatch_background { 
    //do lengthy operation 
    dispatch_semaphore_signal(semaphore) 
    } 
} 

for semaphore in semaphores { 
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) 
} 
+1

possibile duplicato di [Multiple worker in Swift Command Line Tool] (http://stackoverflow.com/questions/28590701/multiple-workers-in-swift-command-line-tool) –

risposta

0

Che ne dite di qualcosa di simile:

func runThingsInTheBackground() { 
    var semaphores = [dispatch_semaphore_t]() 

    for delay in [2, 3, 10, 7] { 
     var semaphore = dispatch_semaphore_create(0) 
     semaphores.append(semaphore) 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) { 
      sleep(UInt32(delay)) 
      println("Task took \(delay) seconds") 

      dispatch_semaphore_signal(semaphore) 
     } 
    } 

    for semaphore in semaphores { 
     dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) 
    } 
} 

Questo è molto simile a quello che hai. Il mio lavoro 'coda' è una serie di secondi per dormire, in modo che tu possa vedere che le cose stanno accadendo in background.

Si noti che questo esegue solo tutte le attività in background. Se si desidera limitare il numero di attività attive, ad esempio il numero di core CPU, è necessario eseguire un po 'più di lavoro.

Non so se questo è quello che stavi cercando, fammi sapere.

+0

Forse la mia domanda non era chiara, ma questo è essenzialmente esattamente ciò che ho postato sopra. Grazie per il tuo post! –

+0

Il mio esempio funziona. Che cosa manca? Penso che risponda alla tua domanda? –

+0

Sono sicuro che il tuo codice funzioni, ma il tuo codice è quasi uguale al mio, in realtà non aggiunge nulla. –

Problemi correlati