Во-первых, вам нужно решить, что делать, если BLE никогда не станет доступным.Это может быть выключено.Это может быть запрещено профилем MDM.Вы хотите просто подождать в этих случаях (возможно, навсегда) или вы хотите вызвать обратный вызов с ошибкой?
В любом случае вам нужно будет удерживать обработчик завершения, пока он не будет готов к работе.используется.
Вы можете сохранить его следующим образом:
var powerOnCompletion: ((Bool) -> Void)?
public func activateBlutooth(completion: @escaping (Bool) -> Void) {
// Fancy way to chain together multiple calls to `activateBluetooth`. You could also just be
// simple and `powerOnCompletion = completion`
let previousHandler = powerOnCompletion
powerOnCompletion = { result in
previousHandler?(result)
completion(result)
}
if centralManager.state == .poweredOn {
powerOnCompletion?(true)
powerOnCompletion = nil
}
}
Затем вы также можете вызвать его в centralManagerDidUpdateState
:
public func centralManagerDidUpdateState(_ central: CBCentralManager) {
switch central.state {
case .unknown:
NSLog("unknown")
case .resetting:
NSLog("resetting")
case .unsupported:
NSLog("unsupporting")
case .unauthorized:
NSLog("unauthorized")
powerOnCompletion?(false) // error, and it's going to improve soon
powerOnCompletion = nil
case .poweredOn:
NSLog("poweredOn")
powerOnCompletion?(true)
powerOnCompletion = nil
case .poweredOff:
NSLog("poweredOff")
powerOnCompletion?(false) // error, and it's going to improve soon
powerOnCompletion = nil
}
}
В зависимости от вашей системы выВозможно, вам захочется подумать о других переходах, например переходить от одного к другому и корректировать их по мере необходимости.Но основной подход заключается в том, что вам придется держаться за обработчик завершения.
Тем не менее, я обычно продолжаю и создаю CBCentralManager
во время init
(вместо использования lazy
),Таким образом, он обычно готов к тому времени, когда что-то ищет его.