С 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 и получить только один ответ после успешного завершения всех действий, если не получена одна ошибка.
Может быть, я мог бы использовать разные предметы или несколько подписок только с одним одноразовым, который я мог бы использовать для отключения, и объединить их?