在Swift 3上运行后台线程

27

我有一个函数,它是这样的:

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)!)
}

我希望在后台线程上运行它。

我尝试了Swift2的GDC方法,但没有起作用。

在Swift3中,线程主题是否有任何变化?

谢谢!


1
http://swiftable.io/2016/06/dispatch-queues-swift-3/ - Sachin Vas
@New16 我已经尝试过了,它甚至无法编译。 - FS.O6
@FS.O6 我在我的代码中使用它。我不知道你是如何实现它的。展示一下你遇到了什么错误。 - Sachin Vas
1
你不想在后台线程上运行它。UI更新永远不应该在后台线程上执行。 - Max Pevsner
显示剩余2条评论
3个回答

59

在后台加载图片是可以的,但在后台线程上执行UI更新是不允许的。这就是为什么该函数必须包含两个线程的原因。

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)!)
            }
        })
    }
}

ImageWithImage是一个裁剪图像的方法,它能在后台线程上完成吗? - FS.O6
@FS.O6,我认为这不应该是问题。你可以测试一下。 - Max Pevsner
好的,太棒了。谢谢! - FS.O6

5

Swift 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)!)
            }
        }
    }
}

2
这个回答与已经接受的回答有什么不同之处?对我来说,这只是一个最小更改的复制粘贴。 - HMD

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接