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
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
It looks like bug in CoreUI working with vector images. I'm having a similar issue right now with a following code
let scaledImage = renderer.image { _ in
self.draw(in: CGRect(origin: .zero, size: scaledImageSize))
}
Looking into [_CUIThemeSVGRendition rawData]
you can see the following release
statement: I was not able to find related retain
so I guess because of that memory is released twice which eventually leads to a crash. It looks like if(r8 & 0x3c) == 0x10)
is checking bitmapEncoding
(see https://developer.limneos.net/index.php?ios=15.2.1&framework=CoreUI.framework&header=CUIThemeRendition.h ) but I have no idea what should be inside. Maybe we should file a bug report to Apple.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.