我对带有加载叠加层的图像的并行处理提出质疑。我在一个需要几秒钟的函数中处理图像。在此期间应显示加载重叠。
问题是,加载叠加层在图像处理后显示,尽管在处理图像之前会调用它。
@IBAction func onFilterRed(sender: UIButton) {
LoadingOverlay.shared.showOverlay(self.view)
var rgbaImage = RGBAImage(image: self.originalImage!)
rgbaImage?.adjustColor(red: 80, green: -30, blue: -30)
self.filteredImage = rgbaImage?.toUIImage()
imageView.image = self.filteredImage
}
我不知道为什么叠加层没有显示在它被调用的位置。
感谢任何提示, 迈克尔
答案 0 :(得分:1)
从我所看到的,你只在主线程上运行:这就是在处理图像时阻止UI的原因。在您调用代码的确切时刻,显示更新不会发生:它将与所有其他UI更新代码排队,因此它们将在每个runloop中一起运行一次。您可以在此处看到解释:Order of operations in runloop on iOS。
无论如何,你可以这样解决:
@IBAction func onFilterRed(sender: UIButton) {
LoadingOverlay.shared.showOverlay(self.view)
// Run on a background thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
var rgbaImage = RGBAImage(image: self.originalImage!)
rgbaImage?.adjustColor(red: 80, green: -30, blue: -30)
self.filteredImage = rgbaImage?.toUIImage()
// Run again on main thread (UI updating code MUST run on main thread)
dispatch_async(dispatch_get_main_queue()) {
imageView.image = self.filteredImage
}
}
}