Как получить стандартный вывод консольного приложения macOS, использующего RunLoop - PullRequest
0 голосов
/ 08 сентября 2018

Вот простой код Swift для консольного приложения macOS:

import Foundation

print("hello world")
RunLoop.main.run()

В моем реальном коде я использую RunLoop, чтобы не покидать консольное приложение, потому что я реагирую на некоторые события CoreBluetooth и имею бесконечный цикл вещей, которые я хочу отобразить. Я просто хочу выйти из приложения, используя Ctrl + C.

Однако при использовании RunLoop.main.run() я не могу больше выводить данные в моем терминале:

$ ./app
hello world
^C
$ ./app | grep hello
^C

Некоторые идеи о том, как я могу получить вывод? Я полагаю, использование RunLoop - плохая идея, но что может быть альтернативой без активного ожидания или ручного управления некоторыми потоками выполнения?

1 Ответ

0 голосов
/ 12 сентября 2018

Вы можете попробовать сбросить стандартный вывод:

fflush(__stdoutp)

или установите размер буфера на stdout равным нулю (делает это быстрым, но использует больше ресурсов):

setbuf(__stdoutp, nil)

См. Swift: как очистить стандартный вывод после печати?

Обычно это решение, когда вы видите вывод на терминал, но не выводите его, когда вы передаете процесс в другой, например, grep. Трубопровод влияет на выбор по умолчанию для буферизации. Надеюсь, это поможет!

...