細節總是取決於你的具體用例。我喜歡將Rx視爲基於流的構建模塊,這些構建模塊需要連接以模擬您的業務邏輯。
有一個例子如何可能看起來像:
enum DeviceService: String, ServiceIdentifier {
case myService = "ffff"
var uuid: CBUUID {
return CBUUID(string: self.rawValue)
}
}
enum DeviceCharacteristic: String, CharacteristicIdentifier {
case startCharacteristic = "0001"
case stopCharacteristic = "0002"
case ackCharacteristic = "ffff"
case command1Characteristic = "0003"
case command2Characteristic = "0004"
var uuid: CBUUID {
return CBUUID(string: self.rawValue)
}
var service: ServiceIdentifier {
return DeviceService.myService
}
}
let peripheral : Peripheral? = nil
// Some internal command 1
let command1 = peripheral!.writeValue(Data(bytes: [0xff, 0xfe]),
for: DeviceCharacteristic.command1Characteristic,
type: .withResponse)
// Some internal command 2
let command2 = peripheral!.writeValue(Data(bytes: [0xdd, 0xee]),
for: DeviceCharacteristic.command2Characteristic,
type: .withResponse)
func batchCommands(commands: [Observable<Characteristic>]) -> Observable<Characteristic> {
let commandsWithAck = commands.map { command in
return command.flatMap { characteristic in
return peripheral!.monitorValueUpdate(for: DeviceCharacteristic.ackCharacteristic).take(1)
}
}
let start = peripheral!.writeValue(Data(bytes: [0x01]),
for: DeviceCharacteristic.startCharacteristic,
type: .withResponse)
let stop = peripheral!.writeValue(Data(bytes: [0x00]),
for: DeviceCharacteristic.startCharacteristic,
type: .withResponse)
return start.concat(Observable.concat(commandsWithAck)).concat(stop)
}
// Call it:
let subscription = batchCommands(commands: [command1, command2])
.subscribe(onNext: nil, onError: nil, onCompleted: nil, onDisposed: nil)
有,start
和stop
觀測可以更改爲監視用戶的行爲,當實際開始排放的項目/停止動作應該發生。
謝謝你。也許我應該做的一點是設備端的服務是UART服務,所以有兩個特性 - TX和RX。在這種情況下,我用TX上的適當命令數據寫入值,然後監視結果的RX。我很好奇的是如何在寫入TX之後乾淨地監視RX,然後恰當地處理ACK(或NACK或錯誤),然後在啓動之後繼續執行任何命令。從我的例子中可以看出,批處理從'start'開始到'ack',其中'ack'被監控。但是在「停止」之前監視值更新塊嗎? – bleeckerj