我试图通过bash简单地利用系统ping功能并输出到窗口。
我遇到的问题以及我希望看到的是否有解决办法(也许我只是做错了,我是新手)是目前如果我运行这个应用程序当我点击“ping”按钮时,应用程序似乎冻结(mac风车),同时它等待ping命令完成10次ping,但随后在窗口中显示bash输出的全文。所以最终产品看起来是正确的,但我不希望它看起来像是崩溃了。
这是一场GIF播放。您无法看到鼠标轮流,但是当我点击Ping按钮时它会旋转直到数据出现。
我想要它做的只是将输出“流”到窗口,而不是看起来锁定并等待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计数完成并立即转储完整的结果。
非常感谢任何帮助!