2017-02-21 42 views
1

我正在开发一个基于web服务的应用程序,并且由于向web服务发送请求的速度太快而导致崩溃。我简直无法让GCD在Swift 3中工作,我正在挠头。我决定贬低它,只是尝试加载4个Web图像到Web视图按顺序。基于我在网上看到的所有内容,下面的代码应该可以工作,但它仍然冻结用户界面,直到所有四个图像加载。我究竟做错了什么?在Swift 3中使用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)" 
    } 

} 

回答

1

冻结UI

因为你在呼唤serialQueue.sync。你几乎从来没有想打电话sync,在这种情况下,你肯定不会。改为使用async

+0

就是这样!哇,我很接近。它不会让我再接受10分钟的答案,但我会。非常感谢! – GED125