Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 创建可观察的,包裹可观察的_Swift_Rx Swift_Rxiosble - Fatal编程技术网

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
的强引用。