我正在尝试构建一个使用CoreBluetooth的命令行应用。问题是,它不适用于命令行应用程序。
我已将我的CoreBluetooth
代码(实现CBCentralManagerDelegate协议的类 - 让我们将此类myBLEManager
调用)从命令行应用项目移动到另一台Mac OS GUI App。
我在ViewDidLoad()
中运行了一些测试 - 超级样本,我只是初始化myBLEManager
,在初始化时创建CBCentralManager
的实例,然后调用scanForPeripherals
。
这是我在CLI和GUI项目中所做的。差异是centralManagerDidUpdateState
永远不会在CLI项目中调用。但它确实在GUI Mac应用程序中。
答案 0 :(得分:3)
大多数Apple框架中的回调都是通过应用程序的主要运行循环提供的。如果您的命令行工具没有运行循环,则它无法接收以这种方式发送的回调。
如果没有runloop,框架调用你的回调的唯一方法就是在另一个线程上运行它,这可能会导致在一个没有预料到的应用程序中出现奇怪的行为。
足以添加:
let runLoop = RunLoop.current
let distantFuture = Date.distantFuture
while running == true && runLoop.run(mode: RunLoopMode.defaultRunLoopMode, before: distantFuture) {
}