実現したいこと
NSViewのインスタンスをpngに変換してローカルに保存するmacOSアプリを作成しています。
1000枚程度一度に生成するため、その進捗状況をプログレスバーを使って表示したいのですが、全ての画像を保存し終わった時にプログレスバーが0から100に一気に進んで終わってしまいます。
リアルタイムにUIを更新し、プログレスバーが徐々に進んでいくようにするにはどのようにすれば良いのでしょうか。
スレッドをうまく使うのだと思うのですが、うまくいっていません。
該当のソースコード
Swift
1class GenerateImageViewController: NSViewController { 2 @IBOutlet weak var generateImageProgressBar: NSProgressIndicator! 3 @IBAction func generateImage(_ sender: NSButton) { 4 generateImageProgressBar.minValue = 0.0 5 generateImageProgressBar.maxValue = 100.0 6 generateImageProgressBar.doubleValue = 0.0 7 8 for i in 1...1000 { 9 DispatchQueue.main.async { 10 // 1.画像として保存するNSViewのインスタンスを作成 11 let image = NSView() 12 13 // 2.NSViewのインスタンスをData型に変換する 14 let rep = symbol.bitmapImageRepForCachingDisplay(in: symbol.bounds)! 15 symbol.cacheDisplay(in: symbol.bounds, to: rep) 16 guard let imageData = rep.representation(using: .png, properties: [:]) else { 17 return 18 } 19 20 // 画像のファイル名の作成 21 let imageName = "image" + String(i) + ".png" 22 23 // 保存するurlの作成 24 let url = URL(fileURLWithPath: /*画像を保存するディレクトリ*/) 25 let imageURL = url.appendingPathComponent(imageName) 26 27 DispatchQueue.global().async { 28 do { 29 // 3.画像を保存する 30 try imageData.write(to: imageURL) 31 32 DispatchQueue.main.async { 33 // 4.プログレスバーを更新する 34 self.generateImageProgressBar.doubleValue += 0.1 35 } 36 } catch(_) { 37 self.generateImageProgressBar.doubleValue += 0.1 38 } 39 } 40 } 41 } 42 } 43 override func viewDidLoad() { 44 super.viewDidLoad() 45 46 // プログレスバーの設定 47 generateImageProgressBar.isIndeterminate = false 48 } 49} 50
試したこと
1.画像として保存するNSViewのインスタンスを作成
2.NSViewのインスタンスをData型に変換する
3.画像を保存する
4.プログレスバーを更新する
この1〜4をループさせています。
1, 2, 4はメインスレッド、3はサブスレッドで処理をしています。
画像を保存するたびに4のプログレスバーの更新をUIに適用させていのですが、どのようにすれば良いのでしょうか。
補足情報(FW/ツールのバージョンなど)
Swift version 4.1.2
Xcode version 9.4.1
回答2件
あなたの回答
tips
プレビュー