flatMap writeValue for characteristic不返回Observable

时间:2017-06-05 14:48:37

标签: swift bluetooth rx-swift ios-bluetooth rxiosble

更新:我刚检查了他们的示例项目,它们是一样的。所以,它可能是一个错误,或者这是预期的行为。

我正在使用RxBluetoothKit,无法弄清楚以下问题。我正在使用这个包装函数来编写一个特性(我试图用concat编写许多函数,它很好用):

func writeCharacteristicData(for peripheral: Peripheral, characteristicIdentifier: CharacteristicIdentifier, value: Data?) -> Observable<Characteristic> {
guard let value = value else {
  return Observable.error(BTError.noDataProvided(description: "Missing value for: \(characteristicIdentifier)"))
}
return peripheral
  .connect()
  .flatMap { $0.writeValue(value,
    for: characteristicIdentifier,
    type: .withResponse) }
}

根据RxBluetoothKit文档.flatMap { $0.writeValue }是写入特征的最简单方法之一。实际上它与readValue一样正常,即使使用此writeValue,写入也是成功的,如果我之后用readValue读回来,characteristic.valueoNext:中就可以了}。

我的问题是这个函数返回Observable<Characteristic>,我的假设是它会给我回写书面值。但事实并非如此,或者至少它对我不起作用。它给了我以前的值或者nil,到目前为止我无法弄清楚发出的Observable<Characteristic>的逻辑是什么。如果我可以取回书面价值,那将是非常好的。我做错了什么?

我甚至尝试了更长的方法,这个在github上提到:

characteristic.writeValue(data, type: .withResponse)
.subscribe { event in
    //respond to errors / successful read
}

发出的特征(在onNext:回调中)不是我写给设备的那个。这是前一个或零。有趣的是,如果我尝试回读它,然后写,那个特征值将是我用$0.readValue读过的那个。但如果我重新编译,写一个全新的,它仍然是我以前读过的。这就像RxBluetoothKit缓存了一个值,或者我完全不知道。

这可能是ble设备的问题吗? 也许这是一个线程问题或类似的东西?

我真的很感激任何建议或提示。

谢谢,

丹尼尔

1 个答案:

答案 0 :(得分:0)

很抱歉没有回复,我刚才注意到了这一点。你的问题仍然存在吗?如果是这样 - 请在我们的Github上写一个问题。它与Core Bluetooth本身的工作方式有关,我们也许应该改进我们的文档,因此将它作为一个问题是好的。你应该做的是再次读取值 - 它将显示正确的值。