2014-11-30 14 views
8

Sto sviluppando un software con Xcode 6 utilizzando Swift. Quando premo un pulsante, il mio codice prende alcune informazioni dal web e le scrive sul mio NSWindow.Utilizzo dei thread per aggiornare l'interfaccia utente con Swift

Quindi immaginate qualcosa di simile:

@IBAction func buttonPressed(sender: AnyObject) 
{ 
    for page in listOfPages      //Number of pages is 40. 
    { 
     var label: NSTextField = NSTextField(); 

     label.stringValue = getInformetionsFromPage(page) 

     /* 
      some code to add label in the window here 
     */ 
    } 
} 

Il problema è che una volta che fa clic sul pulsante, ci vuole un po prima di vedere la lista dei risultati, nel tempo principale dell'app è congelato. Questo perché non sto usando alcun thread per gestire questo problema. Come posso implementare i thread per vedere ogni etichetta aggiornata in ogni fase del ciclo? Sono nuovo con i thread e Swift, quindi avrei bisogno di aiuto!

Grazie ragazzi.

risposta

12

C'è GCD. Ecco un uso di base:

funzione
for page in listOfPages { 
    var label = NSTextField() 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
     let result = getInformationFromPage(page) 
     dispatch_async(dispatch_get_main_queue()) { 
      label.stringValue = result 
     } 
    } 
} 

dispatch_async eseguito in modo asincrono il blocco di codice sulla coda data. Nella prima chiamata dispatch_async, inviamo il codice per l'esecuzione sulla coda di sfondo. Dopo aver ottenuto result aggiorniamo etichetta sulla coda principale con quella result

+0

Eccellente! Ho solo un dubbio, qui nel tuo codice dove dovrei impostare la cornice dell'etichetta nella finestra? Prima della terza linea? – Matt

+2

Non so se è vero per il cacao ma nel tocco di cacao non si dovrebbe mai accedere al codice ui su un thread diverso da quello principale. Quindi, prima della prima spedizione e all'interno del secondo blocco di spedizione, è possibile accedere in tutta sicurezza al codice ui – mustafa

+0

Grazie mille !! – Matt

11

Swift 3.0 versione

DispatchQueue.main.async() { 
    // your UI update code 
} 

Pubblicato questo perché XCode non può suggerire la sintassi corretta da 2,0 SWIFT versione

Problemi correlati