【发布时间】:2017-04-21 20:01:37
【问题描述】:
我有一个返回 observable 的方法。
在这个方法中我订阅了rxbluetooth observable。除了永远不会调用 onComplete 之外,它运行良好。
这是我的代码:
private func getWifiConfig() -> Observable<String?> {
return Observable.create { [ weak self ] observer in
if let strongSelf = self {
tileConnect.peripheral.connect()
.retry(.delayed(maxCount: 30, time: 1), scheduler: MainScheduler.instance)
.flatMap { $0.discoverServices([ strongSelf.serviceUUID ]) }
.flatMap { Observable.from($0) }
.flatMap { $0.discoverCharacteristics([ strongSelf.wifiCharacteristicUUID ])}
.flatMap { Observable.from($0) }
.flatMap { $0.readValue() }
.retry(.delayed(maxCount: 30, time: 1), scheduler: MainScheduler.instance)
.subscribe(onNext: {
if let data = $0.value {
if let configDelimitedString = String(data: data, encoding: .utf8) {
observer.onNext(configDelimitedString)
}
}
}, onError: { error in
LOG_SENSOR_MANAGER("getWifiConfigFromCharacteristic. onError: \(error.localizedDescription)")
observer.onError(error)
}, onCompleted: {
LOG_SENSOR_MANAGER("getWifiConfigFromCharacteristic. onCompleted")
observer.onCompleted() // <---- NEVER CALLED
}, onDisposed: {
LOG_SENSOR_MANAGER("getWifiConfigFromCharacteristic. onDisposed") // <---- NEVER CALLED
})
.disposed(by: strongSelf.disposeBag)
}
return Disposables.create()
}
}
你知道为什么吗?
【问题讨论】:
-
两个思路:第一个在
onCompleted()之前被处理第二个每次出错,重试。 -
在
retry和subscribe之间添加debug()并发布输出。 -
@DanielT,是的,我正在使用 RxBluetoothKit
-
似乎在处理一次性用品之前不会调用 Competed 和 Disposed 。使用计时器定期调用 getWifiConfig。也许我做错了什么......