GUI зависает при выполнении Task - PullRequest
0 голосов
/ 06 июня 2019

У меня есть небольшое приложение, которое выполняет некоторые сценарии bash. У меня уже есть рутина, и она работает до сих пор. Но .... GUI зависает каждый раз при выполнении скриптов. Вот что у меня уже есть:

func syncShellExec(path: String, args: [String] = []) {
    let process            = Process()
    process.launchPath     = "/bin/bash"
    process.arguments      = [path] + args
    let outputPipe         = Pipe()
    let filelHandler       = outputPipe.fileHandleForReading
    process.standardOutput = outputPipe

    filelHandler.readabilityHandler = { pipe in
        let data = pipe.availableData
        if let line = String(data: data, encoding: .utf8) {
            DispatchQueue.main.async {
                self.logger.string += line
            }
        } else {
            print("Error decoding data: \(data.base64EncodedString())")
        }
    }

    process.launch()
    process.waitUntilExit()
    filelHandler.readabilityHandler = nil
}

и я хочу, чтобы это было так:

    var task:Process!
    var out:FileHandle?
    var outputTimer: Timer?

    let path = "/bin/bash"
    let workDir = "/Users/luigi/Desktop"
    let arguments = "source"
    let arguments = ["backup.sh", arguments]
    task = Process.init()
    task.launchPath = path
    task.arguments = arguments
    task.currentDirectoryPath = workDir
    self.task.launch()
    DispatchQueue.global().async {
        // this runs in a worker thread, so the UI remains responsive
        print ("wating for exit")
        self.task.waitUntilExit()
        DispatchQueue.main.async {
            // do so in the main thread
            if let timer = self.outputTimer {
                timer.invalidate()
                self.outputTimer = nil
            }
        }
    }

Что я должен сделать, чтобы интегрировать незамерзающую часть нижней функции в верхнюю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...