Komme hier bei einer Swift Sache nicht weiter. Ich habe diesen Code hier.
Code
- 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
- }
Nachteil ist, dass er während des Ausführens die GUI der App einfriert aus der das ganze gestartet wird. Nun habe ich dieses Beispiel im Netz gefunden um den Task von der GUI abzukoppeln. Nur irgendwie krieg ichs nicht hin mir das entsprechend umzubauen. Vllt. kann mir da ja jemand weiterhelfen? Mit den 3 var´s am Anfang ist klar das die ganz nach oben müssen in meiner AppDelegate.swift aber der Rest? Hier das Beispiel:
Code
- var task:Process!
- var out:FileHandle?
- var outputTimer: Timer?
- let path = "/bin/bash"
- let workDir = "/path/to/working/folder"
- let sourcePath = "source"
- let destinationPath = "destination"
- let arguments = ["backup.sh", sourcePath, destinationPath]
- 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
- }
- }
- }