CFRunLoop im Swift-Kommandozeilenprogramm

Ich schreibe eine Befehlszeilenanwendung in Swift unter Verwendung eines Drittanbieter-Frameworks, das (wenn ich den Code richtig verstehe) auf GCD-Rückrufe angewiesen ist, um bestimmte Aktionen auszuführen, wenn ein Socket Daten empfängt. Um das Framework besser zu verstehen, habe ich mit einer Kakao-Beispielanwendung herumgespielt, die der Autor des Frameworks geschrieben hat, um dem Framework zu folgen.

Da es sich bei der Beispielanwendung um eine Cocoa-Anwendung handelt, werden die Ausführungsschleifen automatisch behandelt. Ich füge Codeausschnitte aus der Beispielanwendung (MIT-Lizenz) hinzu, um eine Vorstellung davon zu bekommen, wie es funktioniert:

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()

   ...

    }
  }

Ich möchte die Beispielanwendung so ändern, dass sie über die Befehlszeile ausgeführt wird. Wenn ich die Funktion startServer () in eine Befehlszeilenanwendung einbaue, wird sie ausgeführt, der Socket wird jedoch sofort nach dem Öffnen geschlossen, und das Programm wird mit einem Beendigungscode 0 ausgeführt. Dies ist das erwartete Verhalten, da es keine Ausführungsschleifen gibt In einem Xcode-Befehlszeilenprojekt muss das Programm nicht warten, bis der Socket Daten empfängt.

Ich glaube, der richtige Weg, um den Socket offen zu halten und das Programm kontinuierlich auszuführen, wäre, den Haupt-Thread in eine CFRunLoop zu setzen. Ich habe die Dokumentation von Apple durchgesehen und abgesehen von der grundlegenden API-Referenz gibt es in Swift nichts zum Thema Threading. Ich habe mir Ressourcen von Drittanbietern angesehen, aber bei allen handelt es sich um alternative Threads in iOS- und Cocoa-Anwendungen. Wie implementiere ich eine CFRunLoop für den Haupt-Thread richtig?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage