2014-09-01 9 views
8

ich ein kleines Problem habe, lassen Sie mich mit dem Code beginnenSwift-Update beschriften (mit HTML-Inhalt) nimmt 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" 

} 

Diese Codes geben Sie mir eine Ausgabe in der Konsole

TEST0
test3
test4
test1
test2

auch die Label Aktuelles zu " test5 "ohne Zeit, aber das Etikett, das auf" test6 "aktualisiert wird, dauert 30 Sekunden.

Ich habe keine Ahnung, warum das so lange dauert, jemand eine Idee?

Antwort

31

Übliche Problem der Benutzeroberfläche in einem sekundären Thread Aktualisierung:

Ihre Schließung ist offensichtlich nicht auf dem Haupt-Thread ausgeführt wird, da die URL Aufgabe asynchron ist. Das Aktualisieren des Labels auf dem Abschluss muss also warten, bis der Hauptthread seine Update-Schleife ausführt. Die Art und Weise, es zu beheben ist den .text = Anruf wickeln, es zu zwingen, auf dem Haupt-Thread ausgeführt werden (das ist, wo die UI-Sachen sowieso laufen sollen):

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

That reparierte es danke Rikkles –

+0

Ich bin nicht sicher, warum dieses Beispiel nur test3 und test4 druckt und mit dem Etikett endet, das test5 für mich mit xcode 6.1.1 zeigt. Ich kopierte den Code in ein neues Single-View-Swift-Projekt und verband eine Beschriftung und Schaltfläche. Mein Einsatzziel ist os ios 8.1. Xcode würde es nicht laufen lassen, bis ich "' dataTaskWithURL (url) '" in "' dataTaskWithURL (url!) '" (Mit Ausrufezeichen) änderte, aber das ist die einzige Änderung, die ich am Beispielcode vorgenommen habe. Mein Computer hat eine Internetverbindung, und ich habe versucht, auf Simulator und iPhone zu laufen. Das Etikett sagt nach 5 Minuten noch "test5". Fehle ich etwas offensichtlich? Vielen Dank. – miker

+0

Was ist in der Fehlervariablen? Ihr URL-Aufruf muss fehlschlagen. – Rikkles

0

In Swift 3:

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