使用DispatchGroup

时间:2018-08-07 20:45:19

标签: swift asynchronous bluetooth-lowenergy

我正在使用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

在这种情况下;呼叫是同步的,除了第一次。也许我需要一种与蓝牙设备完全不同的工作方式?我正在寻找稳定,易于使用的模式来连接外围设备并从中读取数据。

0 个答案:

没有答案