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)
}
}
}