【发布时间】:2020-09-07 21:21:20
【问题描述】:
在进行蓝牙通信时,通常会遇到这样一种情况,即进行调用并在委托中获得响应,例如如下所示的特征发现:
func discoverCharacteristics(device: CBPeripheral)
{
servicesCount = device.services!.count
for service in device.services!
{
print("Discovering characteristics for service \(service.uuid)")
device.discoverCharacteristics([], for: service)
}
}
现在这个发现不是针对特定设备,而是针对遵循蓝牙 SIG 服务/配置文件的健康设备,所以我不确切知道它们可能具有哪些服务,也不知道每个服务中可能有多少特征.该方法是异步的,答案在以下委托方法中发出信号:
// Discovered Characteristics event
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?)
{
for characteristic in service.characteristics!
{
print("Found characteristic \(characteristic.uuid)")
}
servicesCount = servicesCount - 1;
print("Characteristics sets left: \(servicesCount)")
if servicesCount == 0
{
print ("Found all characteristics")
DispatchQueue.main.async{
self.btleManager!.btleManagerDelegate.statusEvent(device: peripheral, statusEvent: Btle.CHARACTERISTICS_DISCOVERED)
}
self.device = peripheral
self.handleMds()
}
}
现在我需要等到发现完成后才能进行下一步,因为我接下来要做什么通常取决于我得到了什么。在 Java 和 Android 中,我所做的是在调用方法中等待 CountDownLatch,然后我在回调中向闩锁发出信号以释放该等待。
CountDownLatch 的 iOS 等效项似乎是 DispatchSemaphore。但是,这样做显然会阻塞系统,并且不会调用任何委托。所以我所做的(如上面的代码所示)是用服务的数量初始化一个变量servicesCount,并在每次发出信号时在委托回调中递减它。当它变为零时,我就完成了,然后我进行下一步。
这种方法行得通,但看起来很老套;它不可能是正确的。当我需要对 DIS 特性、特性、各种时间服务等进行多次读取时,它开始变得非常混乱。所以我想知道什么是等待代表的正确方法在继续前进之前获得信号?回想一下,我不知道这些设备可能具有哪些服务或特性。
【问题讨论】:
标签: ios swift core-bluetooth