Swift:为蓝牙中央管理器选择队列

Swift: Choose queue for Bluetooth Central manager

我正在开发将通过 BLE 与智能设备连接并与之通信的应用程序。

问题是:处理蓝牙事件的最佳做法是什么队列?

我读了很多教程,在所有教程中我发现了这个:

centralManager = CBCentralManager(delegate: self, queue: nil)

他们选择在主队列 (queue: nil) 中处理蓝牙事件,但我认为这不是好的做法。因为可能有很多查询从中央设备发送到外围设备,而很多答案从外围设备发送到中央设备。

我认为这可能是应用程序运行缓慢的原因,可能会对工作效率产生不利影响,对吗?

这会淹没 UI 更新队列吗?

从蓝牙的角度来看,我不认为将事件排队是最佳做法;除了你想延迟发送消息。

你绝对应该为 CBCentralManager 使用一个单独的队列,最好也将它用于与 CBPeripheral 对象的所有通信 - 这样你的主队列就不会被阻塞。

dispatch_async 队列中的事件应该不是问题 - 只要 read/write 请求没有延迟。

我在我的蓝牙项目中使用 CBCentralManager dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0) 有一段时间了,它工作完美。

^ 从头开始​​。我不建议使用全局队列。原因是全局队列是并发队列,而您可能需要串行队列。创建一个新的 DispatchQueue(label: "CentralManager") 并将其传递给 CBCentralManager.

所有委托方法都将传送到您指定的队列。如果你对这些方法做一些非常轻的操作,我想你可以保留主队列。但是最好使用后台队列。