MacOS приложение работает быстро в XCode, но медленно, как приложение архивирования - PullRequest
0 голосов
/ 27 февраля 2020

Я пытался заставить его выполнить команду в фоновом режиме и постоянно читать вывод из нее.

Сначала я запускаю 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 секунд ..

...