2016-07-15 9 views
0

質問があります並行処理画像がオーバーレイされています。私は数秒必要な関数で画像を処理しています。その間にローディングオーバレイが表示されます画像処理後にオーバーレイが表示されます

画像が処理される前に呼び出されていますが、が処理された後に、ローディングオーバーレイが表示されるという問題があります。

@IBAction func onFilterRed(sender: UIButton) { 

    LoadingOverlay.shared.showOverlay(self.view) 

    var rgbaImage = RGBAImage(image: self.originalImage!) 
    rgbaImage?.adjustColor(red: 80, green: -30, blue: -30) 

    self.filteredImage = rgbaImage?.toUIImage() 
    imageView.image = self.filteredImage 


} 

なぜ、オーバーレイが呼び出された場所にオーバーレイが表示されないのかわかりません。私が見ることができるものから任意のヒントの

おかげで、

答えて

1

マイケルは、あなただけのメインスレッド上で動作している:画像の処理中にUIがブロックされている理由です。表示更新は、コードを呼び出した直後には発生しません。他のすべてのUI更新コードと一緒にキューに入れられているため、実行ループごとに1回ずつ実行されます。あなたはここに説明を見ることができます:Order of operations in runloop on iOS

とにかく、あなたがこのように解決することができます:

@IBAction func onFilterRed(sender: UIButton) { 
    LoadingOverlay.shared.showOverlay(self.view) 

    // Run on a background thread 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
     var rgbaImage = RGBAImage(image: self.originalImage!) 
     rgbaImage?.adjustColor(red: 80, green: -30, blue: -30) 

     self.filteredImage = rgbaImage?.toUIImage() 

     // Run again on main thread (UI updating code MUST run on main thread) 
     dispatch_async(dispatch_get_main_queue()) { 
      imageView.image = self.filteredImage 
     } 
    } 
} 
+0

うわー、素晴らしいAlessandor ... どうもありがとう!チャーミーのような作品... – Michael

関連する問題