我正在创建一个图像过滤应用程序,基本上你在视图控制器上显示图像,底部有几个不同的图像过滤器;单击一个将影响主图像亮度(例如)。我注意到应用滤镜在更高分辨率的图像上花费更长的时间,所以我想到创建一个完成处理程序(这是我第一次做这个完成事情)并显示"活动指示器视图"在viewcontroller的中心通知用户它的工作...所以下面是func(在一个ImageProcessor.swift类中),它改变图像亮度并将CIImage发送回视图控制器:
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)
问题:
第一:我不知道我是否第一次正确使用完成处理程序,所以我会欢迎一些建议。
第二:指示灯不显示或停止。该应用程序只是冻结了几秒钟并再次备份,这让我觉得完成工作可能不会在后台完成。
非常感谢你的时间。
答案 0 :(得分:0)
终于找到了解决方案。它是通过不使函数返回任何东西并使用闭包在它准备好时分配给对象。我猜这是挂起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)
希望这可以帮助其他人面对同样的问题。