CFRunLoop в программе командной строки Swift
Я пишу приложение командной строки в Swift, используя стороннюю платформу, которая (если я правильно понимаю код) использует обратные вызовы GCD для выполнения определенных действий, когда сокет получает данные. Чтобы лучше понять фреймворк, я поэкспериментировал с примером приложения Cocoa, которое автор фреймворка написал для поддержки фреймворка.
Поскольку пример приложения является приложением Какао, циклы выполнения обрабатываются автоматически. Я включил фрагменты кода из примера приложения (лицензия MIT), чтобы дать представление о том, как это работает:
class AppDelegate: NSObject, NSApplicationDelegate {
var httpd : Connect!
func startServer() {
httpd = Connect()
.onLog {
[weak self] in // unowned makes this crash
self!.log($0)
}
.useQueue(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0))
...
httpd.listen(1337)
}
...
func applicationDidFinishLaunching(aNotification: NSNotification?) {
startServer()
...
}
}
Я хотел бы изменить пример приложения для запуска из командной строки. Когда я помещаю функцию startServer () в приложение командной строки, она запускается, но сокет сразу закрывается после его открытия, и программа завершает выполнение с кодом выхода 0. Это ожидаемое поведение, поскольку циклов выполнения нет в проекте командной строки Xcode, и, таким образом, программа не знает, ждать, пока сокет получит данные.
Я считаю, что правильный способ заставить сокет оставаться открытым и непрерывно запускать программу - поместить основной поток в CFRunLoop. Я просмотрел документацию Apple, и, за исключением базовой справки по API, в Swift ничего не написано о многопоточности. Я посмотрел на сторонние ресурсы, но все они связаны с альтернативными потоками в приложениях iOS и Cocoa. Как правильно реализовать CFRunLoop для основного потока?