gpt4 book ai didi

swift - Swift 命令行程序中的 CFRunLoop

转载 作者:行者123 更新时间:2023-11-30 13:49:09 25 4
gpt4 key购买 nike

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

最佳答案

Martin R 的答案似乎应该有效,但是我能够通过单个函数调用使套接字保持打开状态。在 startServer() 函数的末尾,我添加了以下行:

CFRunLoopRun()

这有效。

关于swift - Swift 命令行程序中的 CFRunLoop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34536356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com