Я пытаюсь создать некоторые функции-оболочки для синхронной обработки некоторых асинхронных вызовов BLE CoreBluetooth с использованием замыканий.Я хочу, чтобы моя функция запуска была заблокирована и не выходила до получения обратного вызова completionHandler
.Однако, если я вызываю мою функцию run
несколько раз в цикле, она не ждет обратного вызова completionHandler
и снова вызывает run
.Таким образом, в конце концов, обратный вызов принимается только для последнего запуска.
Как я могу изменить свой код так, чтобы он ожидал в функции run
, пока в функции registerDidUpdateCallback
не будет вызван completionHandler()
?
Я попытался прочитать несколько статейнасчет замыканий, но я все еще в замешательстве, и мой мозг зажарен.
func run(characteristic: CBCharacteristic, completionHandler: @escaping
CommandCompletionHandler) {
registerDidUpdateCallback(completionHandler)
motePeripheral.basePeripheral?.readValue(for: characteristic)
}
func registerDidUpdateCallback(completionHandler: @escaping CommandCompletionHandler) {
motePeripheral.setDidUpdateCharacteristicCompleteCallback { (updatedCharacteristic) -> Void in
let decoded = updatedCharacteristic.getDecoded()
print("Done reading and decoding Read
characteristic: \(updatedCharacteristic) with
Value: \ . (decoded)")
completionHandler(true)
}
}