2016-08-11 1 views
1

時間を浪費する前に、表示されません。動作は持続する。ビューは、私は私のアプリではこの指標を実装しました操作

私の操作では、画像をいくつか操作してユーザーに表示しますが、「操作を実行」ボタンをクリックするたびに、アプリが数秒間フリーズし、結果が表示され、オーバーレイが表示されますスピナー。 私はこのような非同期派遣を試してみた:

@IBAction func manipulateImage(sender: AnyObject) { 
    dispatch_async(dispatch_get_main_queue(), { 
        LoadingOverlayView.show() 
       }); 
     if let beginImage = CIImage(image: self.imageView.image!) { 
        var outputImage = OutputImage(sourceImage: beginImage) 
    //apply CIFilters: 
        outputImage.applyFilter(FilterType.Grayscale) 
        outputImage.applyFilter(FilterType.Sepia) 
        outputImage.applyFilter(FilterType.Vignette) 
        outputImage.applyFilter(FilterType.Shadow) 

        let cgimg = self.imageContext.createCGImage(outputImage, fromRect: outputImage.extent) 

        self.imageView.image = UIImage(CGImage: cgimg) 
    LoadingOverlayView.hide() 
} 

が、それは動作しません。また、非同期ディスパッチのない通常のメソッド呼び出しもまったく同じように動作します。

+1

これ以上のコードを表示する必要があります。このコードはどこに呼び出されていますか?あなたは 'LoadingOverlayView'をどこに隠していますか? – AdamPro13

+0

@ AdamPro13私は私がそこに持っているかなり多くのeveythingとのポストを更新しました。 – user2462794

+0

メインスレッドで実行していますか? – Wain

答えて

1

このコードはUIスレッドで実行されている可能性があります。その場合、次のように操作をバックグラウンドキューにディスパッチできます。

// we're already on the UI thread, so dispatch to a background queue 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    // do your background operations ... 
    if let beginImage = CIImage(image: self.imageView.image!) { 
     var outputImage = OutputImage(sourceImage: beginImage) 
     //apply CIFilters: 
     outputImage.applyFilter(FilterType.Grayscale) 
     outputImage.applyFilter(FilterType.Sepia) 
     outputImage.applyFilter(FilterType.Vignette) 
     outputImage.applyFilter(FilterType.Shadow) 

     let cgimg = self.imageContext.createCGImage(outputImage, fromRect: outputImage.extent) 

     // make sure to dispatch UI function back to main queue! 
     dispatch_async(dispatch_get_main_queue(), { 
       self.imageView.image = UIImage(CGImage: cgimg) 

       LoadingOverlayView.hide() 
      }); 
    } 
}); 

// we're already on the UI thread, so show the overlay now 
LoadingOverlayView.show() 
+0

これはかなり好きですが、このログがあります: 'このアプリケーションは、自動切り出しエンジンをバックグラウンドスレッドから修正しており、エンジンの破損や奇妙なクラッシュが発生する可能性があります。これにより、将来のリリースで例外が発生するでしょう。私はそれを取り除くべきだと思います。 – user2462794

+0

バックグラウンドスレッドでUI操作を行うことについて警告されていますが、この警告には注意してください。メインのキューにUI操作をディスパッチする方法については、コード内のメモを参照してください(オーバーレイの非表示など)。 – CSmith

関連する問題