我正在使用SwiftyBluetooth库连接到蓝牙外围设备。我有以下代码尝试与外设建立连接:
init?(peripheral: Peripheral) {
SwiftyPeripheral = peripheral
let group = DispatchGroup()
var Success = false
group.enter()
peripheral.connect(withTimeout: nil) { result in
switch result {
case .success:
Success = true
group.leave()
return
case .failure(let error):
Success = false
group.leave()
return
}
}
group.wait()
if(!Success) {
return nil
}
}
如果我删除调度组,则代码可以正常工作;但是派遣小组在那里完成处理程序永远不会被调用。我尝试在后台线程上调用外周设备。
// =======编辑=========
与库Dev对话,显然该库旨在在平均线程上运行,因此看来我在死锁主线程。还有其他可用来等待的模式吗?我不在乎我怎么做。我只需要等待该连接,然后再从构造函数中返回
// =====编辑2 =====
这是另一个引起麻烦的情况:
这里,我有一个从外围设备读取的只读属性。所以;第一次读取该属性时,应该从外围设备读取它,然后可以从内存中简单地读取它。
var PeripheralType : peripheralType {
get {
let semaphore = DispatchSemaphore(value: 1)
if(_peripheralType == peripheralType.unknown) {
semaphore.wait()
SwiftyPeripheral!.readValue(ofCharacWithUUID: CharacteristicUuid.DeviceProtocol.rawValue, fromServiceWithUUID: ServiceUuid.DeviceInformationService.rawValue) { result in
switch result {
case .success(let data):
switch(data) {
case Data(hex: "0x01"):
self._peripheralType = peripheralType.TypeOne
semaphore.signal()
case Data(hex: "0x02"):
self._peripheralType = peripheralType.TypeTwo
semaphore.signal()
default:
self._peripheralType = peripheralType.unknown
semaphore.signal()
}
case .failure(let error):
self._peripheralType = peripheralType.unknown
semaphore.signal()
}
}
}
semaphore.wait()
return _peripheralType
}
}
private var _peripheralType : peripheralType = peripheralType.unknown
在这种情况下;呼叫是同步的,除了第一次。也许我需要一种与蓝牙设备完全不同的工作方式?我正在寻找稳定,易于使用的模式来连接外围设备并从中读取数据。