后台线程中缩放图像崩溃-UIGraphicsImageRenderer

时间:2019-06-18 12:33:08

标签: ios swift background

private func scale(image ciImage: CIImage?, for scale: CGFloat) -> UIImage {
    guard let ciImage = ciImage else {
        return UIImage()
    }

    let image = UIImage(ciImage: ciImage)
    let size = CGSize(width: image.size.width * scale, height: image.size.height * scale)

    let renderer = UIGraphicsImageRenderer(size: size)

    return renderer.image(actions: { (context) in
        image.draw(in: CGRect(origin: .zero, size: size))
    })
}

我正在使用此方法缩放(并在此之前生成)图像。这是在后台线程中完成的,然后将结果分派回主线程。但是,在image.draw上-有时十分之一,应用程序会因EXC_BAD_ACCESS崩溃。

我在做什么错?我可以在后台执行此操作吗?

谢谢

1 个答案:

答案 0 :(得分:2)

请勿在后台线程中执行任何UI操作。所有的UI更改都必须在主线程中完成

使用调度队列在主线程中工作。像这样尝试

DispatchQueue.main.async { 
   image.draw(in: CGRect(origin: .zero, size: size))
}

检查this答案以了解为什么我们使用主线程执行UI动作