使用DispatchGroup时从未调用Swift完成处理程序
我正在使用SwiftyBluetooth库连接蓝牙外围设备。我有以下代码试图与外设建立连接:使用DispatchGroup时从未调用Swift完成处理程序,swift,asynchronous,bluetooth-lowenergy,Swift,Asynchronous,Bluetooth Lowenergy,我正在使用SwiftyBluetooth库连接蓝牙外围设备。我有以下代码试图与外设建立连接: init?(peripheral: Peripheral) { SwiftyPeripheral = peripheral let group = DispatchGroup() var Success = false group.enter() peripheral.connect(withTimeout: nil) { result in
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
}
}
如果我删除调度组,代码就可以正常工作;但调度组在那里;永远不会调用完成处理程序。我已尝试在后台线程上调用peripheral.connect,但无效
//=======编辑==========
与库开发人员交谈,显然这个库是要在平均线程上运行的,所以看起来我正在死锁主线程。有没有其他模式可以让我等待?我不在乎我怎么做;我只需要等待连接,然后再从构造函数返回
//====编辑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
在这种情况下;除第一次调用外,调用是同步的。也许我需要一种与蓝牙设备完全不同的工作方式?我正在寻找稳定、易于使用的模式,用于连接到外围设备并从中读取数据 不要试图使异步操作同步。使用
group。如果需要,请通知,但也可以直接在connect
闭包中编写代码。在初始化器中使用异步方法是不合适的。如何初始化外围设备?建立连接似乎是初始化的关键部分,在建立连接之前,我不知道如何继续与BLE设备交互。我可以写一个“连接”方法,但我会遇到同样的死锁问题。我可以为我的主连接和读取控制序列菊花链函数,但这种逻辑很难读取和维护…我更喜欢有一个函数封装一个简洁明了的总体控制序列。我同意对于@Paulw11,init本身不应该是异步的,最好让实例的API是异步的。我稍后会尝试添加一个答案,不过有一点需要澄清,就是使用初始化器不适合这样做。