Опрос ответа от адаптера 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. Инициализируйте вашего центрального менеджера с выделенной очередью, чтобы вы могли прослушивать ответы на периферийные устройства и обрабатывать эти данные соответствующим образом.

Другие вопросы по тегам