Ios 斯威夫特-为什么不使用我的信号灯?

Ios 斯威夫特-为什么不使用我的信号灯?,ios,swift3,bluetooth-lowenergy,semaphore,Ios,Swift3,Bluetooth Lowenergy,Semaphore,嗨,我有一个关于信号灯的问题。请看我的密码。 为什么我的信号灯不工作? 这是关于结案代码的问题? 我想检查“电源功能”是否同步激活 一,。因为您正在为CBCentralManager使用主队列,然后用信号量阻塞主队列。请稍候。2.不要这样做。处理这个事实,世界是asynchronous@paulw11:抱歉我的错误:)您是对的:)当信号量计数变为负数时,所有期望信号量的线程都将等待:)当计数为0且第一个线程接近信号量时,它将得到一个,信号量计数变为-1,因此当请求信号量线程时,第二个线程将被阻止

嗨,我有一个关于信号灯的问题。请看我的密码。 为什么我的信号灯不工作? 这是关于结案代码的问题?
我想检查“电源功能”是否同步激活

一,。因为您正在为
CBCentralManager
使用主队列,然后用
信号量阻塞主队列。请稍候。2.不要这样做。处理这个事实,世界是asynchronous@paulw11:抱歉我的错误:)您是对的:)当信号量计数变为负数时,所有期望信号量的线程都将等待:)当计数为0且第一个线程接近信号量时,它将得到一个,信号量计数变为-1,因此当请求信号量线程时,第二个线程将被阻止,直到第一个线程释放它持有的线程:)因此实现了同步:)我说如果它的0线程将被阻止是错误的:)干杯:)谢谢你的评论:)我意识到我需要更改“centralManager”的队列以激活同步。“但这可能对过程不利。”Sandeppebhandari——我很感激你们试图澄清,但那个描述仍然不正确。但这是没有实际意义的:对于信号量来说,这根本不是一个好的用例。David真的应该删除他的信号量代码,只使用异步模式。@rob:我同意使用信号量不是解决异步模式问题的最佳方法:)我在评论中解释了这一点,因为Paulw指出了我答案中的一个错误(我后来删除了该错误)我想感谢他让我知道了这个问题,并想澄清我为什么感到困惑:)上面的评论不是为了说服任何人使用信号量:)
class BLEManager {
    private let bleManagerCB = BLEManagerCB()

    func checkPowered() -> Bool {
        let semaphore = DispatchSemaphore(value: 0)
        var state : Bool?

        bleManagerCB.checkPowered()
        bleManagerCB.onCompletionPowered = { result in
            state = result
            self.semaphore.signal()
        }
        semaphore.wait()
        return state
    }
}
class BLEManagerCB:NSObject, CBCentralManagerDelegate {

    var centralManager:CBCentralManager!
    var onCompletionPowered:((_ result:Bool) -> Void)?

    func checkPowered() {
        centralManager = CBCentralManager(delegate: self, queue: nil)
        //centralManagerDidUpdateState(delegate method) call.
    }

    //check power
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        if central.state == .poweredOn {
            onCompletionPowered!(true)

        } else if central.state == .poweredOff {
            onCompletionPowered!(false)
        }
    }
}