Запустите фоновый поток на Swift 3

У меня есть функция, которая выглядит следующим образом:

fileprivate func setupImageViewWithURL(url: URL) {
    var image: UIImage? = nil
    do {
        try image = UIImage(data: Data(contentsOf: url))!
    } catch is NSError {
        print("Failed")
    }

    image = self.imageWithImage(sourceImage: image!, scaledToWidth: UIScreen.main.bounds.size.width)
    self.imageImageView.image = image
    self.imageImageView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: (image?.size.height)!)
}

Я хочу запустить его на Background thread.

Я пробовал GDC методы Swift2, но это не сработало.

Изменилось ли что-нибудь в теме ветки в Swift3?

Благодарю вас!


person FS.O6    schedule 06.10.2016    source источник
comment
@ New16 Я уже пробовал, он даже не соответствует   -  person FS.O6    schedule 06.10.2016
comment
@ FS.O6 Я использую это в своем коде. Я не знаю, как вы это реализуете. Покажите, какую ошибку вы получаете.   -  person Sachin Vas    schedule 06.10.2016
comment
Вы не хотите запускать его в фоновом потоке. Обновления пользовательского интерфейса никогда не должны выполняться в фоновых потоках.   -  person Max Pevsner    schedule 06.10.2016
comment
@MaxPevsner Я хочу загрузить изображение на фоне, потому что сейчас оно очень медленное   -  person FS.O6    schedule 06.10.2016
comment
@FS.O6, см. мой ответ ниже.   -  person Max Pevsner    schedule 06.10.2016


Ответы (3)


Можно загружать изображение в фоновом режиме, но нельзя выполнять обновления пользовательского интерфейса в фоновом потоке. Вот почему функция должна содержать два потока.

func setupImageViewWithURL(url: URL) {
    var image: UIImage? = nil

    DispatchQueue.global().async { 
        do {
            try image = UIImage(data: Data(contentsOf: url))!
        } catch {
            print("Failed")
        }
        DispatchQueue.main.async(execute: {
            if image != nil {
                image = self.imageWithImage(sourceImage: image!, scaledToWidth: UIScreen.main.bounds.size.width)
                self.imageImageView.image = image
                self.imageImageView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: (image?.size.height)!)
            }
        })
    }
}
person Max Pevsner    schedule 06.10.2016
comment
ImageWithImage это метод, который обрезает изображение, можно ли это сделать в фоновом потоке? - person FS.O6; 06.10.2016
comment
@ FS.O6, я не думаю, что это должно быть проблемой. Вы можете проверить это. - person Max Pevsner; 06.10.2016
comment
Ок, отлично. Спасибо! - person FS.O6; 06.10.2016

Свифт 4.0

func setupImageViewWithURL(url: URL) {

    var image: UIImage? = nil
    DispatchQueue.global(qos: .background).async {
        do {
            try image = UIImage(data: Data(contentsOf: url))!
        } catch {
            print("Failed")
        }
        DispatchQueue.main.async {
            if image != nil {
                image = self.imageWithImage(sourceImage: image!, scaledToWidth: UIScreen.main.bounds.size.width)
                self.imageImageView.image = image
                self.imageImageView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: (image?.size.height)!)
            }
        }
    }
}
person Prateek kumar    schedule 12.04.2018
comment
Что этот ответ добавляет к уже принятому ответу? Для меня это просто копипаст с минимальными изменениями. - person HMD; 12.04.2018

DispatchQueue.global(qos: .background).async {

}

person Aditya Sharma    schedule 05.01.2018