Search code examples
iosswiftbackground

Scaling image in background thread crashes - UIGraphicsImageRenderer


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

I am using this method to scale (and generate before that) images. This is done in background thread and the result is then dispatched back to main thread. However, on image.draw - sometimes 1 out of 10 times, the app crashes with EXC_BAD_ACCESS.

What am I doing wrong? Can I do that in background?

THANKS


Solution

  • Don't do any UI actions in a background thread. All UI changes must be done in the main thread

    Use a dispatch Queue to work in main thread.Try it like this

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

    Check this answer to know why we use main thread to perform UI actions