在 Completion Handler 中显示/隐藏 Activity Indicator View

Display / Hiding Activity Indicator View in Completion Handler

我正在创建一个图像过滤应用程序,基本上你的图像显示在视图控制器上,底部有几个不同的图像过滤器;单击其中一个会影响主图像的亮度(例如)。我注意到在更高分辨率的图像上应用过滤器需要更长的时间,所以我想创建一个完成处理程序(这是我第一次做这个完成的事情)并在 [=28] 的中心显示 "activity indicator view" =] 通知用户它正在工作...所以下面是更改图像亮度并将 CIImage 发送回视图控制器的函数(在 ImageProcessor.swift class 中):

func setBrightness(ciImage: CIImage, intensity: Float = 0.5, completion: (CIImage) -> CIImage) -> CIImage? {
    let filter = CIFilter(name: "CIColorControls");
    filter?.setValue(ciImage, forKey: kCIInputImageKey);
    filter?.setValue(intensity, forKey: "inputBrightness");
    return completion((filter?.outputImage)!);
}

那么这就是从 viewcontroller 中调用它的方式:

    case .Brightness:
        self.loader.startAnimating();
        imgViewFiltered.image = processor.getUIImage(processor.setBrightness(CIImage(image: imgViewFiltered.image!)!, completion: { (let ci) -> CIImage in
            dispatch_async(dispatch_get_main_queue()) {
                self.loader.stopAnimating();
            }
            return ci;
        })!)
        lastUsedFilter = FilterTypes.Brightness;
        appliedFilters.updateValue(0.5, forKey: FilterTypes.Brightness)

问题:

1st:我不知道自从我第一次使用完成处理程序以来我是否正确使用它,所以我欢迎一些建议。

第2:指标不显示或停止。该应用程序只是冻结了几秒钟,然后再次备份,这让我觉得完成可能没有在后台完成它的工作。

非常感谢您的宝贵时间。

终于找到解决办法了。它是通过不使函数 return 成为任何东西,并在准备就绪时使用闭包分配给对象。我想那是连接 main_que 所以这是修正案:

func setBrightness(ciImage: CIImage, intensity: Float = 0.5, completion: (CIImage) -> Void) {
let filter = CIFilter(name: "CIColorControls");
filter?.setValue(ciImage, forKey: kCIInputImageKey);
filter?.setValue(intensity, forKey: "inputBrightness");
completion(filter?.outputImage)!;

}

并调用它并分配图像:

case .Brightness:
    self.loader.startAnimating();
    processor.setBrightness(CIImage(image: imgViewFiltered.image!)!, completion: { (let ci) in
        dispatch_async(dispatch_get_main_queue()) {
            imgViewFiltered.image = UIImage(CIImage: ci);
            self.loader.stopAnimating();
        }
    })!
    lastUsedFilter = FilterTypes.Brightness;
    appliedFilters.updateValue(0.5, forKey: FilterTypes.Brightness)

希望这可以帮助其他面临同样问题的人。