在图像处理后显示加载叠加

时间:2016-07-15 10:25:56

标签: ios swift

我对带有加载叠加层的图像的并行处理提出质疑。我在一个需要几秒钟的函数中处理图像。在此期间应显示加载重叠

问题是,加载叠加层在图像处理后显示,尽管在​​处理图像之前会调用它。

@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


}

我不知道为什么叠加层没有显示在它被调用的位置。

感谢任何提示, 迈克尔

1 个答案:

答案 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
        }
    }
}