ファイルを出力して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
    }

}