SWIFT 3 - 我可以将bash命令的输出“流”化到输出窗口吗?

时间:2017-08-10 00:16:19

标签: swift bash ping

我试图通过bash简单地利用系统ping功能并输出到窗口。

我遇到的问题以及我希望看到的是否有解决办法(也许我只是做错了,我是新手)是目前如果我运行这个应用程序当我点击“ping”按钮时,应用程序似乎冻结(mac风车),同时它等待ping命令完成10次ping,但随后在窗口中显示bash输出的全文。所以最终产品看起来是正确的,但我不希望它看起来像是崩溃了。

这是一场GIF播放。您无法看到鼠标轮流,但是当我点击Ping按钮时它会旋转直到数据出现。

Animated GIF of Application Execution.

我想要它做的只是将输出“流”到窗口,而不是看起来锁定并等待ping完成。我希望实时看到每个ping都出现在窗口中。

这是我用来执行带参数的bash命令的函数:

    import Foundation

    func runCmd(cmd : String, args : String...) -> String {

    let task = Process()
    task.launchPath = cmd
    task.arguments = args

    let outpipe = Pipe()
    task.standardOutput = outpipe

    task.launch()

    let outdata = outpipe.fileHandleForReading.readDataToEndOfFile()

    guard let string = String(data: outdata, encoding: .utf8) else { return ""}

    let output = string.trimmingCharacters(in: .newlines)

    return (output)
    }

这是我的ViewController:

    import Cocoa


    class ViewController: NSViewController {

        @IBOutlet weak var resultsOutput: NSTextField!

        override func viewDidLoad() {
            super.viewDidLoad()



            // Do any additional setup after loading the view.
        }

        override var representedObject: Any? {
            didSet {
            // Update the view, if already loaded.
            }
        }

        @IBAction func pingbutton(_ sender: Any) {
            let eIP = runCmd(cmd: "/bin/bash", args: "-c", "ipconfig getifaddr en0")
            let pingip = runCmd(cmd: "/bin/bash", args: "-c", "ping -c 10 -S \(eIP) www.google.com")

            resultsOutput.stringValue = pingip

            }

            }

当前工作的应用程序并生成我正在寻找的结果,但我想尽可能让它生成输出的每一行,因为它是生成而不是看起来冻结直到10个ping计数完成并立即转储完整的结果。

非常感谢任何帮助!

0 个答案:

没有答案
相关问题