私は画像フィルタリングアプリを作成しています。基本的に、ビューコントローラーに画像が表示され、下部にいくつかの異なる画像フィルターがあります。いずれかをクリックすると、メインの画像の明るさに影響します (たとえば)。高解像度の画像ではフィルターの適用に時間がかかることに気付いたので、完了ハンドラーを作成することを考えました (これは私がこの完了を行うのは初めてです)、ビューコントローラーの中央に「アクティビティインジケータービュー」を表示して通知しますユーザーはその作業を行っています...以下は、画像の明るさを変更し、CIImage をビューコントローラーに送り返す関数 (ImageProcessor.swift クラス内) です。
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)
問題:
1つ目:初めてから完了ハンドラを適切に使用しているかどうかわからないので、アドバイスを歓迎します。
2 番目: インジケーターが表示されないか、停止します。アプリは数秒間フリーズして再びバックアップするだけなので、完了がバックグラウンドで機能していないのではないかと思いました。
お時間をいただきありがとうございます。