0

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

お時間をいただきありがとうございます。

4

1 に答える 1

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)

これが同じ問題に直面している他の人に役立つことを願っています。

于 2016-03-18T12:57:32.393 に答える