2014-07-23 15 views
5

Ich verwende Xcode 6 Beta 4, und ich versuche, ein Remote-Image abzurufen und es einem UIImageView zuzuordnen. Ich verwende eine NSURLSession dataTask, um diese asynchron zu machen. Hier ist mein Code:Weisen Sie UIImageView ein neues Bild mit Swift zu

func dataTask(imageUrl: String, targetImage:UIImageView) { 

    let nsURL = NSURL(string: imageUrl) 

    let task = NSURLSession.sharedSession().dataTaskWithURL(nsURL) { 
     (data, response, error) in 
     if !error { 
      NSLog("No Error!")     
      var image:UIImage = UIImage(data: data) 
      targetImage.image = image 
     } 
     else { 
      NSLog("Error!") 
     } 
    } 

    task.resume() 
} 

dies ist, wie ich den Anruf zu tätigen:

 self.dataTask("http://bicicletaspony.com/img/spn/TeamA.png", targetImage: image) 

Und das ist der Fehler, den ich :(erhalten

beenden app aufgrund nicht abgefangene Ausnahme ‚NSInternalInconsistencyException ', Grund:' Änderungen an der Layout-Engine dürfen nicht von einem Hintergrundthread ausgeführt werden. '

Es ist eine sehr einfache Bildzuordnung. Warum stürzt es so ab ?! jede Hilfe wird sehr geschätzt!

Antwort

8

Der Abschluss, der am Ende von dataTaskWithURL ausgeführt wird, wird auf einem Hintergrundthread aufgerufen. UIKit (wie die meisten anderen Toolkits) kann nur vom Hauptthread aus aufgerufen werden. Ihr Code hat den Trick

if !error { 
    NSLog("No Error!")    
    var image:UIImage = UIImage(data: data) 
    dispatch_async(dispatch_get_main_queue(), { 
     targetImage.image = image 
    }) 
} 
+1

iain Danke für Ihre Antwort so schnell !, auch: Sie werden festlegen müssen das Bild auf dem Hauptthread mit so etwas wie dieses! –

Verwandte Themen