Swift 创建可观察的,包裹可观察的
我有一个方法,它返回一个可观察的 在这个方法中,我订阅了Swift 创建可观察的,包裹可观察的,swift,rx-swift,rxiosble,Swift,Rx Swift,Rxiosble,我有一个方法,它返回一个可观察的 在这个方法中,我订阅了rxbluetoothobservable。除了从不调用onComplete之外,它工作得很好 这是我的密码: private func getWifiConfig() -> Observable<String?> { return Observable.create { [ weak self ] observer in if let strongSelf = self { tileConn
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()
}
}
private func getWifiConfig()->可观察{
返回可观察的。在中创建{[弱自我]观察者
如果让strongSelf=self{
tileConnect.peripheral.connect()
.retry(.delayed(最大计数:30,时间:1),调度程序:MainScheduler.instance)
.flatMap{$0.discoverServices([strongSelf.serviceuid])}
.flatMap{observeable.from($0)}
.flatMap{$0.discoverCharacteristicUUID([strongSelf.wifiCharacteristicUUID])发现特征
.flatMap{observeable.from($0)}
.flatMap{$0.readValue()}
.retry(.delayed(最大计数:30,时间:1),调度程序:MainScheduler.instance)
.订阅(onNext:{
如果let data=$0.0{
如果让configDelimitedString=String(数据:数据,编码:.utf8){
observer.onNext(configDelimitedString)
}
}
},onError:{中有错误
日志\u传感器\u管理器(“getWifiConfigFromCharacteristic.onError:\(error.localizedDescription)”)
observer.onError(错误)
},未完成:{
日志传感器管理器(“getWifiConfigFromCharacteristic.onCompleted”)
observer.onCompleted()//您可以尝试以下操作:
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)
observer.onCompleted() // <- Call it here
}
}
}, onError: { error in
LOG_SENSOR_MANAGER("getWifiConfigFromCharacteristic. onError: \(error.localizedDescription)")
observer.onError(error)
})
.disposed(by: strongSelf.disposeBag)
}
return Disposables.create()
}
}
您可以尝试以下方法:
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)
observer.onCompleted() // <- Call it here
}
}
}, onError: { error in
LOG_SENSOR_MANAGER("getWifiConfigFromCharacteristic. onError: \(error.localizedDescription)")
observer.onError(error)
})
.disposed(by: strongSelf.disposeBag)
}
return Disposables.create()
}
}
两个想法:第一个是在onCompleted()之前处理它。
第二个是每次都会出错并重试。你看过了吗?放一个debug()
在您的重试
和订阅
之间,然后发布输出。@DanielT,是的,我使用的是RxBluetoothKit似乎在一次性处理之前不会调用Competite和Disposed。getWifiConfig会使用计时器定期调用。可能我做错了什么……两个想法:第一,在一次之前处理它completed()
2nd每次都会出错并重试。您看过了吗?放一个debug()
在您的重试
和订阅
之间,然后发布输出。@DanielT,是的,我使用的是RxBluetoothKit似乎在一次性处理之前不会调用Competite和Disposed。getWifiConfig会使用计时器定期调用。可能是我做错了什么……这不起作用。守卫让self
…没有执行。你能解释一下发生了什么吗?使用guard-let-self=self-else{return}
你可以访问self
,而不是self?
或strongSelf
。你可以用保留字“self”创建对self
的强引用。这不起作用。守卫让self
…没有被执行。你能解释一下发生了什么吗?使用guard让self=self-else{return}
你可以访问self
而不是self?
或strongSelf
。你可以用保留字“self”创建对self
的强引用。