2014-09-01 21 views
8

ho avuto un piccolo problema, mi permetta di iniziare con il codiceSwift Aggiornamento Label (con contenuto HTML) batte 1min

class ViewController: UIViewController { 

@IBOutlet weak var LBoutput: UILabel! 
@IBAction func BTclick(sender: AnyObject) { 
    var url = NSURL(string: "http://google.com") 
    println("test0") 
    let getdata = NSURLSession.sharedSession().dataTaskWithURL(url){(data ,response , error) in 
     var htmlContent = NSString(data: data, encoding: NSUTF8StringEncoding) 
     println("test1") 
     println("test2") 
     self.LBoutput.text = "test6" 
    } 
    println("test3") 
    getdata.resume() 
    println("test4") 
    LBoutput.text = "test5" 

} 

Questi codici mi danno un'uscita nella console di

test0
test3
test4
test1 test2

anche gli aggiornamenti etichetta per " test5 "senza tempo, ma l'etichetta da aggiornare a" test6 "ha una durata di 30 secondi.

Non ho idea del perché questo richiede così tanto tempo, qualcuno un'idea?

risposta

31

solito problema di aggiornare UI in un thread secondario:

tuo chiusura non è ovviamente in esecuzione sul thread principale, come il compito URL è asincrona. Pertanto, l'aggiornamento dell'etichetta sulla chiusura dovrà attendere che il thread principale esegua il suo ciclo di aggiornamento. Il modo per risolvere il problema è quello di avvolgere la chiamata .text = per costringerlo a correre sul thread principale (che è dove la roba UI dovrebbe funzionare in ogni caso):

 dispatch_async(dispatch_get_main_queue()) { 
      self.LBoutput.text = "test6" 
     } 
+0

Quello risolto grazie Rikkles –

+0

Non sono sicuro del motivo per cui questo campione stampa solo test3 e test4 e termina con l'etichetta che mostra test5 per me con xcode 6.1.1. Ho copiato il codice in un nuovo progetto swift a vista singola e ho collegato un'etichetta e un pulsante. Il mio obiettivo di distribuzione è os ios 8.1. Xcode non lo lasciava funzionare finché non ho cambiato "' dataTaskWithURL (url) '" in "' dataTaskWithURL (url!) '" (Con punto esclamativo) ma questa è l'unica modifica che ho apportato al codice di esempio. Il mio computer ha una connessione internet e ho provato a girare su simulatore e iphone. L'etichetta dice ancora "test5" dopo 5 minuti. Mi manca qualcosa di ovvio? Grazie. – miker

+0

Cosa c'è nella variabile di errore? La tua chiamata url deve fallire. – Rikkles

0

In Swift 3:

DispatchQueue.main.async 
{ 
    self.LBoutput.text = "test6" 
}