猿问

Swift命令行程序中的CFRunLoop

我正在使用第三方框架在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?


慕盖茨4494581
浏览 571回答 2
2回答

函数式编程

似乎Martin R的答案应该起作用,但是我能够通过一个函数调用使套接字保持打开状态。在startServer()函数的末尾,我添加了以下代码:CFRunLoopRun()哪个有效。
随时随地看视频慕课网APP
我要回答