我正在使用第三方框架在Swift中編寫命令行應用程序(如果我正確理解代碼),則當套接字接收數據時,該框架依賴GCD回調來完成某些操作。為了更好地理解該框架,我一直在研究框架作者與框架一起編寫的示例Cocoa應用程序。因為示例應用程序是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?
Swift命令行程序中的CFRunLoop
慕蓋茨4494581
2019-12-06 10:37:06