遅いファイル出力処理でのプログレスバーの表示がうまくいかない
ファイルを出力してUIActivityViewController経由で転送する、という処理があります。
ファイルの元データを加工する処理を追加したのですが、この処理が遅くプログレスバーを表示させようと、現在苦戦しています。お知恵をお貸しください。
想定している動作は、
ボタンをタップ
->プログレスバーを載せたUIViewの子クラスが表示され、ファイルの加工処理開始。
->加工が完了したらプログレスバーの表示が100%になる。
->ファイルを出力。
->UIActivityViewControllerが表示される。
というものなのですが、
現状ではボタンタップ後、数秒経ってからプログレスバーが表示され、ほぼ同時にUIActivityViewControllerが表示されてしまいます。><;
GCDを組み込んでみたりしたのですが(★の箇所)動作も理解もいまいちな状態です。
コードを以下に記します。
お手数ではありますが、どのように直したら良いかお教え頂けますと大変助かります。
どうぞよろしくお願いいたします。
class MyClass: UITableViewController {
fileprivate var _viewProgress: MyProgressView!
@IBOutlet fileprivate weak var btnAction: UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
//プレグレスバーを載せたビューを準備
_viewProgress = MyProgressView() //(UIViewの子クラス)
_viewProgress.isHidden = true
self.view.addSubview(_viewProgress)
}
/// ボタン押下時処理
@IBAction func btnAction_Tap(_ sender: UIBarButtonItem) {
//プログレスバーを表示
_viewProgress.setProgress(0.0)
//_viewProgress.isHidden = false
_viewProgress.show()
/* 追記 show関数の中身↓
func show() {
if let oya = self.superview {
self.center = CGPoint(x: oya.frame.width / 2, y: oya.frame.height / 2) //中央に配置
oya.bringSubview(toFront: self) //最前面に配置
}
self.isHidden = false
*/
//ファイル作成
createFile() //---(1)へ
}
/// (1) ファイル作成処理
func createFile() {
//ファイル出力
let rs = getData() //---(2)へ
let filePath: String = outputFile(rs) //tmpフォルダに出力
//(出力成功)
if filePath != "" {
let file = URL(fileURLWithPath: filePath)
let handler: ((Bool) -> Void) = { [unowned self] (completed) in
if completed == true {
print("処理完了")
}
self._viewProgress.dismiss()
}
//ダイアログ(UIActivityViewController)を表示
showDialog(self, activityItems: [file as AnyObject], handler: handler)
//(出力失敗)
} else {
//〜エラーメッセージ表示〜
}
}
/// (2) データ加工処理
func getData() -> [[String : String]] {
//加工元のレコードセットを取得
var rs: [[String : String]] = getOrgData()
DispatchQueue.global(qos: .default).sync { //---★
//ループしてレコードを1行ずつ処理
for i in 0 ..< rs.count {
//進捗表示
DispatchQueue.main.async { [unowned self] in //---★
self._viewProgress.setProgress(Float(i + 1) / Float(rs.count))
}
var data = rs[i]
//〜データの加工をゴリゴリ〜
rs[i] = data
}
}
return rs
}
}