Опрос ответа от адаптера BLE в Swift
Используя адаптер на основе сокета Wi-Fi, я могу успешно запросить ответ:
func writeMessageWithResponse(message: String) -> [String] {
self.waitingForResponse = true
let runLoop = NSRunLoop.currentRunLoop()
if self.response != nil {
self.response?.removeAll()
}
writeMessage(message) // this will set self.waitingForResponse to false when a response is received
while self.waitingForResponse && runLoop.runMode(NSDefaultRunLoopMode, beforeDate: NSDate.distantFuture()) {
// waiting for flag (self.waitingForResponse) to be set
}
return self.response!
}
Когда я использую этот же код с CBCentralManager
BLE соединение, основной поток заблокирован и не получает ответ от соединения. Я пытался изменить CBCentralManager
в другую очередь, но я получаю те же результаты.
У кого-нибудь есть идея, как ждать в цикле и все еще быть в состоянии получить ответ BLE? Я знаю, что ответ отправляется, но поток заблокирован и не читает его.
Использование асинхронной функции с завершением Handler не будет работать для этого варианта использования, потому что мне нужна многократно используемая функция, которая может выдавать цепочку команд, каждая из которых зависит от результата последнего ответа.
1 ответ
API CBCentralManager и CBPeripheral на самом деле не предназначены для этого. Вы должны использовать методы, предоставляемые протоколами CBPeripheralDelegate и CBCentralManagerDelegate. Инициализируйте вашего центрального менеджера с выделенной очередью, чтобы вы могли прослушивать ответы на периферийные устройства и обрабатывать эти данные соответствующим образом.