2017-04-21 9 views
0

관찰 가능 객체를 반환하는 메소드가 있습니다.관찰 가능 객체 생성하기 관찰 가능 객체를 감싸는 객체

이 방법에서는 내가 관찰 할 수있는 rxbluetooth을 구독합니다. 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() 
    } 
    } 

당신이 생각하는 이유가 있습니까 : 여기

내 코드?

+0

두 아이디어 : 그것은 각 타임 아웃'onCompleted()'2 그것은 오류 전에 배치 및 시도한다 1. –

+0

https://github.com/Polidea/RxBluetoothKit을 보셨습니까? –

+0

'retry'와'subscribe' 사이에'debug()'를 넣고 출력을 게시하십시오. –

답변

0

이 작업을 시도 할 수 있습니다 :

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() 
    } 
} 

편집이 : 모양을 개선하고 생각합니다. 당신은 자신에 대한 강한 참조를 가지고 guard를 사용할 수 있습니다

private func getWifiConfig() -> Observable<String?> { 

    return Observable.create { [ weak self ] observer in 

     guard let `self` = self else { return } // strong reference to self. Now you can use self as strongSelf 

     // subscription 
     let subscription = tileConnect.peripheral.connect() 
      .retry(.delayed(maxCount: 30, time: 1), scheduler: MainScheduler.instance) 
      .flatMap { $0.discoverServices([ self.serviceUUID ]) } 
      .flatMap { Observable.from($0) } 
      .flatMap { $0.discoverCharacteristics([ self.wifiCharacteristicUUID ])} 
      .flatMap { Observable.from($0) } 
      .flatMap { $0.readValue() } 
      .retry(.delayed(maxCount: 30, time: 1), scheduler: MainScheduler.instance) 
      .subscribe(onNext: { 
       if let data = $0.value, 
       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) 
      }) 


     // Dispose the subscription 
     return Disposables.create { 
      subscription.dispose() 
     } 
    } 
} 
+0

이것은 작동하지 않았습니다. 가드는'자기 '가 ... 사형 당하지 않았다. 무슨 일이 일어나는지 설명해 주실 수 있습니까? –

+0

'self? self else'{return}'를 사용하면'self?'나'strongSelf' 대신'self'에 접근 할 수 있습니다. 예약어 "self"를 사용하여 'self'에 대한 강력한 참조를 만듭니다. – XFreire

관련 문제