2017-07-05 30 views
0

以下是我想要实现:使用辅助/备份观察到,只要主要可观察到的还没有发出任何价值

|--------------------A-A-A-A-A-A| primary (behavior subject) 
|-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-| secondary (flowable) 
|-B-B-B-B-B-B-B-B-B-BA-A-A-A-A-A| result (flowable) 

基本上,我在等待用户输入(通过主观察到)但我想提供系统生成的值,如果用户还没有输入任何东西。一旦收到用户输入,辅助观察将不再使用。

我看着switchIfEmptycombineLatest,但他们不适合我的需要,因为:

  1. switchIfEmpty只有当主要可观察到的信号的onComplete工作。
  2. combineLatest只有当两个观测发出值

有没有办法做到这一点的作品?

回答

2

我无法知道,如果它这样做最简单的还是最优雅的方式,但这个工程:

const a = Observable.interval(5000); 
const b = Observable.interval(1000); 

const sharedA = a.shareReplay(1); 

const result = b.takeUntil(sharedA).concat(sharedA); 

Demo

另一个,也许简单的方法,将

const sharedA = a.share(); 
const result = b.takeUntil(sharedA).merge(sharedA); 

Demo

+0

谢谢你,有没有办法恢复到可观察到的B' (即重置可观察的a,好像它没有发射任何物品一样)? – Nima

+0

我真的不明白你的意思。你不重置observables。他们发射,然后他们完成或错误,然后他们完成。 –

+0

所以这里有一个具体的例子:用户想要订购一辆车。他可以手动设置一个取货地点(可观察的a),否则我们提供gps位置(可观察的b)作为取货地点。现在,如果用户点击地图上的“我的位置”按钮,则我们希望返回到gps位置作为提供商。我试图用多个地方观察到的单个观察值来解决这个问题,所以我不能真正重新创建它。 – Nima

0

在涵盖你的纪念nts上接受的答案......即:

用户想要订购一辆车。他可以手动设置一个取货地点(可观察的a),否则我们提供gps位置(可观察的b)作为取货地点。现在,如果用户点击地图上的“我的位置”按钮,则我们希望返回到gps位置作为提供商。

您有三个源流:

  • 一个:当前GPS位置(纬度/经度对流。)
  • B:手动选择纬度/经度(纬度/经度对流。 )
  • C:A键龙头(空隙流)

我RxSwift而非RxJava写到这,但希望你能翻译:

extension Observable { 
    static func switchBetween(_ a: Observable<Element>, _ b: Observable<Element>, using trigger: Observable<Void>) -> Observable<Element> { 
     return Observable.create { observer in 
      let lock = NSRecursiveLock() 
      var withB = false 
      let disposeA = a.subscribe({ event in 
       if withB == false { 
        observer.on(event) 
       } 
      }) 
      let disposeB = b.subscribe({ event in 
       lock.lock(); defer { lock.unlock() } 
       withB = true 
       observer.on(event) 
      }) 
      let disposeTrigger = trigger.subscribe({ event in 
       if case .next = event { 
        lock.lock(); defer { lock.unlock() } 
        withB = false 
       } 
      }) 
      return Disposables.create(disposeA, disposeB, disposeTrigger) 
     } 
    } 
} 

可以这样调用:

Observable.switchBetween(a, b, using: c)