2017-02-21 3 views
1

Я работаю над приложением, основанным на веб-сервисе, и я пришел к аварийному отказу из-за слишком быстрого отправки запросов на веб-сервис. Я просто не могу заставить GCD работать в Swift 3, и я царапаю себе голову. Я решил отключить его и просто попробуйте загрузить 4 веб-изображения в веб-представление по порядку. На основании всего, что я вижу в Интернете, следующий код должен работать, но он все еще замораживает пользовательский интерфейс, пока все четыре изображения не загрузятся. Что я делаю не так?Многопоточность в 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

замораживания пользовательского интерфейса

Потому что вы звоните serialQueue.sync. Вы почти никогда хотите позвонить sync, и в этом случае вы, конечно, этого не сделаете. Вместо этого используйте async.

+0

Именно так! Вау, я был близок. Это не позволит мне принять этот ответ еще на 10 минут, но я это сделаю. Спасибо огромное! – GED125

Смежные вопросы