Как объединить несколько подписок на Disposable в RxSwift с помощью RxBluetooth? - PullRequest
0 голосов
/ 16 октября 2018

С RxBluetooth никогда не было так легко подключиться к CBPeripheral:

disposable = peripheral.establishConnection()
        .flatMap { $0.discoverServices([serviceId]) }.asObservable()
        .flatMap { Observable.from($0) }
        .flatMap { $0.discoverCharacteristics(nil)}.asObservable()
        .flatMap { Observable.from($0) }
        .flatMap { $0.readValue() }
        .subscribe(onNext: { characteristic in
            // At this point we have connected to the peripheral
            // Discovered the service with the id 'serviceId'
            // Discovered all the characteristics of the service
            // and this print will be triggered after reading each value

            print(Value read: characteristic.value)

        })

Я хотел бы объединить действия с периферией, поэтому, когда срабатывает подписка, я знаю, чтоиметь проверенное периферийное устройство.

Одноразовые будут иметь сцепленные действия и будут возвращать true, если действия были установлены успешно или ошибка.

Примерно так:

disposable = peripheral.establishConnection()

        // Action 1: Let's validate the advertismentData, if it doesn't have the correct advertisement data, we trigger an error

        .flatMap { self.validateAdvertisementData($0) }
        // If there is no error we continue
        .flatMap { $0.discoverServices([serviceId]) }.asObservable()
        .flatMap { Observable.from($0) }
        .flatMap { $0.discoverCharacteristics(nil)}.asObservable()
        .flatMap { Observable.from($0) } 
        .flatMap { $0.readValue() }

        // Action 2: Let's validate the characteristics values, if a characteristic is missing a value we trigger an error

        .flatMap { self.validateInitialCharacteristics($0) }

        // If there is no error we continue by discovering the rest of the services of the peripheral

        // Action 3: We keep discovering services as this is a validated peripheral

        .flatMap { peripheral.discoverServices([healthServiceId, communicationServiceId]) }.asObservable()
        .flatMap { Observable.from(peripheral) }
        .flatMap { $0.discoverCharacteristics(nil)}.asObservable()
        .flatMap { Observable.from($0) } 
        .flatMap { $0.readValue() }

        //Action 4: Let's validate that we read the values and send an initialization packet to the peripheral   

        .flatMap { self.validateSubCharacteristics($0) }

        //Action 5: The values are valid, let's initialize the Peripheral

        .flatMap { self.initialize(peripheral) }

        //If we get a response, then it calls onNext.

        .subscribe(onNext: { Bool in
            // At this point we have connected to the peripheral
            // Discovered the service with the id 'serviceId'
            // Discover all the characteristics of the service
            // Read all values of these characteristics
            // Validated all the values
            // Made another discover for other services
            // Read the characteristics for those
            // Validated the values
            // Write to the peripheral
            // and this print will be triggered after the writing 

            print("Peripheral ready")

        }, onError: { Error in 

            print("Peripheral initialization failed")
        })

ИтакОсновная идея состоит в том, чтобы объединить различных действий с RxSwift и получить только один ответ после успешного завершения всех действий, если не получена одна ошибка.

Может быть, я мог бы использовать разные предметы или несколько подписок только с одним одноразовым, который я мог бы использовать для отключения, и объединить их?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...