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 для основного потока?

Ответы на вопрос(2)

Ваш ответ на вопрос