Как передать потенциальную ошибку между методами - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь обернуть периферийные методы Core Bluetooth для использования в React Native.Это аналог уже готового кода Android, поэтому API установлен.

Когда я звоню CBPeripheralManager.addService , мне нужно выполнить или отклонить обещание, переданное со стороны JavaScript..

Проблема в том, что Core Bluetooth не предлагает обратный вызов для метода, похоже, он ожидал private func peripheralManager(_ peripheral: CBPeripheralManager, didAddService service: CBService, error: Error?)

Я новичок в iOS и Swift, так что это поведение кажется странныммне.Любые идеи, как я могу обернуть функцию, чтобы я мог обрабатывать сообщения об ошибках правильно?

Спасибо

class BLE: NSObject, CBPeripheralManagerDelegate {
    var advertising: Bool = false
    var servicesMap = Dictionary<String, CBMutableService>()
    var manager: CBPeripheralManager!

    override init() {
        super.init()
        manager = CBPeripheralManager(delegate: self, queue: nil, options: nil)
    }

    func addService(promise, serviceUUID) {
        let serviceUUID = CBUUID(string: uuid)
        let service = CBMutableService(type: serviceUUID, primary: true)
        manager.add(service)
    }

    private func peripheralManager(_ peripheral: CBPeripheralManager, didAddService service: CBService, error: Error?) {
        if let error = error {
            // this should reject the addService promise
            return
        }
        // this should fulfill the promise
    }    
}

1 Ответ

0 голосов
/ 03 января 2019

Непонятно, что это за тип promise, но вам нужно где-то его сохранить, а потом выполнить его позже. Например, вы можете добавить свойство:

var pendingServices: [CBUUID: Promise] = [:]

(я не знаю, какой у тебя тип обещания на самом деле здесь)

Тогда вы сохраните его в addService:

assert(pendingServices[serviceUUID] == nil)
pendingServices[serviceUUID] = promise

И позже (правильный, см. Мой комментарий) метод делегата, вы разберетесь с ним:

if let promise = pendingServices.removeValue(forKey: service.uuid) {
    promise.fulfill() // Or whatever you do with it
}
...