使用DispatchGroup时从未调用Swift完成处理程序

使用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

我正在使用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
    }
}
如果我删除调度组,代码就可以正常工作;但调度组在那里;永远不会调用完成处理程序。我已尝试在后台线程上调用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是异步的。我稍后会尝试添加一个答案,不过有一点需要澄清,就是使用初始化器不适合这样做。