Я пытался заставить его выполнить команду в фоновом режиме и постоянно читать вывод из нее.
Сначала я запускаю DispatchQueue.global(qos: .default).async
. Внутри него команда запускается как Process
, а вывод выводится как Pipe
, и она продолжает читать String
из Pipe
, выполнить некоторые вычисления, а затем обновить пользовательский интерфейс с помощью DispatchQueue.main.async
.
Я думаю, следует отметить, что это приложение панели меню MacOS с приложением запуска, которое позволяет запускать его при входе в систему.
Основной код следующий, который выполняется в mainApplication:
func applicationDidFinishLaunching(_ aNotification: Notification) {
// do some UI preparation
DispatchQueue.global(qos: .default).async {
let topTask = Process()
topTask.launchPath = "/usr/bin/env"
topTask.arguments = ["nettop", "-d", "-P", "-J", "bytes_in,bytes_out", "-x", "-L", "0", "-c", "-t", "external"]
let outpipe = Pipe()
topTask.standardOutput = outpipe
topTask.launch()
while (topTask.isRunning) {
if let newData = String(data: outpipe.fileHandleForReading.readData(ofLength: 1024), encoding: .utf8) {
// do some calculation...
DispatchQueue.main.async {
self.updateUI()
}
}
}
}
topTask.waitUntilExit()
topTask.terminate()
}
}
Как уже упоминалось в заголовке, когда я нажимаю Command + R
, обновление интерфейса происходит быстро (каждую 1 секунду). Но если я заархивирую приложение и нажму, чтобы открыть его вне xcode, в Finder, то обновление пользовательского интерфейса будет медленным.
Я попытался войти в систему, пока l oop, он обновляет пользовательский интерфейс почти один раз за 10 секунд ..