【问题标题】:Run a background thread on Swift 3在 Swift 3 上运行后台线程
【发布时间】:2017-02-15 03:07:41
【问题描述】:

我有一个这样的函数:

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 上运行它。

我尝试了Swift2GDC方法,但是没有用。

Swift3 中的主题有什么变化吗?

谢谢!

【问题讨论】:

标签: ios iphone swift cocoa-touch swift3


【解决方案1】:

在后台加载图片是可以的,但是在后台线程执行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,我认为这应该不是问题。你可以测试一下。
  • 好的,太好了。谢谢!
【解决方案2】:

斯威夫特 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)!)
            }
        }
    }
}

【讨论】:

  • 这个答案添加到已经接受的答案是什么?对我来说,这只是一个复制粘贴,改动很小。
【解决方案3】:

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多