2017-02-21 5 views
1

Ich arbeite an einer Webservice-basierten App, und ich bin zu einem Absturz gekommen, weil ich Anfragen zu schnell an den Webservice gesendet habe. Ich kann einfach nicht GCD in Swift 3 arbeiten und ich kratze mich am Kopf. Ich habe mich entschieden, es zu vertuschen und versuche einfach, 4 Web-Bilder in einer Web-Ansicht zu laden. Basierend auf allem, was ich online sehe, sollte der folgende Code funktionieren, aber es friert immer noch die Benutzeroberfläche ein, bis alle vier Bilder geladen sind. Was mache ich falsch?Multithreading in Swift 3 mit GCD

import UIKit 

let imageURLs = ["http://www.planetware.com/photos-large/F/france-paris-eiffel-tower.jpg", "http://adriatic-lines.com/wp-content/uploads/2015/04/canal-of-Venice.jpg", "http://hd-wall-papers.com/images/wallpapers/hi-resolution-pictures/hi-resolution-pictures-5.jpg", "http://hd-wall-papers.com/images/wallpapers/hi-resolution-pictures/hi-resolution-pictures-1.jpg"] 

class Downloader { 

class func downloadImageWithURL(_ url:String) -> UIImage! { 

    let data = try? Data(contentsOf: URL(string: url)!) 
    return UIImage(data: data!) 
    } 
} 

class ViewController: UIViewController { 

@IBOutlet weak var imageView1: UIImageView! 

@IBOutlet weak var imageView2: UIImageView! 

@IBOutlet weak var imageView3: UIImageView! 

@IBOutlet weak var imageView4: UIImageView! 

@IBOutlet weak var sliderValueLabel: UILabel! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func didClickOnStart(_ sender: AnyObject) { 
    let serialQueue = DispatchQueue(label: "syncQueue") 

    serialQueue.sync{ 
     let img1 = Downloader.downloadImageWithURL(imageURLs[0]) 
     DispatchQueue.main.async(execute: { 

      self.imageView1.image = img1 
     }) 
    } 

    serialQueue.sync{ 
     let img2 = Downloader.downloadImageWithURL(imageURLs[1]) 
     DispatchQueue.main.async(execute: { 

      self.imageView2.image = img2 
     }) 
    } 

    serialQueue.sync{ 
     let img3 = Downloader.downloadImageWithURL(imageURLs[2]) 
     DispatchQueue.main.async(execute: { 

      self.imageView3.image = img3 
     }) 
    } 

    serialQueue.sync{ 
     let img4 = Downloader.downloadImageWithURL(imageURLs[3]) 
     DispatchQueue.main.async(execute: { 

      self.imageView4.image = img4 
     }) 
    } 




    } 
    @IBAction func sliderValueChanged(_ sender: UISlider) { 

     self.sliderValueLabel.text = "\(sender.value * 100.0)" 
    } 

} 

Antwort

1

die UI Einfrieren

Weil Sie serialQueue.sync anrufen. Sie fast nie möchten sync anrufen, und in diesem Fall tun Sie sicherlich nicht. Verwenden Sie stattdessen async.

+0

Das war es! Wow, ich war nah dran. Ich werde diese Antwort nicht für weitere 10 Minuten akzeptieren, aber ich werde es tun. Ich danke dir sehr! – GED125