2017-04-26 6 views
0

私は、アクションを開始および停止(トグル)するためのボタンがあるとします。RxSwift:(完了した)ストリームを繰り返す

let toggleStream: Observable<Bool> = toggleBtn.rx.tap.scan(false) { state, _ in !state } 

私は別のストリームを持っており、Integersを連続して出力します。

let emitter = Observable<Int>.interval(2.0, scheduler: timerScheduler) 

ここで、トグルストリームを使用して、2番目のストリームの発光を開始および停止します。これは私のアプローチです:

Observable.combineLatest(toggleStream, emitter) { shouldEmit, evt in 
    return (shouldEmit, evt) 
}.takeWhile{ (shouldEmit, evt:Int) in 
    return shouldEmit == true 
}.map {(_, evt) in 
    return evt 
} 

これは初めて役に立ちます。ボタンを押すとObservableIntsの発光を開始します。また、作業を停止します。残念ながら、ストリームが完了したので、もう一度起動することはできません。ユーザーがボタンをもう一度切り替えると、再起動/再試行/繰り返しができますか?

答えて

1

ここで私は遊び場でそれをやった。あなたは外挿することができるはずです:

//: Playground - noun: a place where people can play 

import RxSwift 

let toggleButton = PublishSubject<Void>() 
let toggleStream: Observable<Bool> = toggleButton 
    .scan(false) { state, _ in !state } 
    .debug() 
    .shareReplayLatestWhileConnected() 

let emit = toggleStream 
    .filter { $0 } 
    .flatMapLatest { _ in 
     Observable<Int>.interval(2.0, scheduler: MainScheduler.instance) 
      .takeUntil(toggleStream.filter { !$0 }) 
    } 


_ = emit.subscribe({ 
    print($0) 
}) 

toggleButton.onNext() 
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5.0) { 
    toggleButton.onNext() 
} 
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 11.0) { 
    toggleButton.onNext() 
} 
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 17.0) { 
    toggleButton.onNext() 
} 

import PlaygroundSupport 
PlaygroundPage.current.needsIndefiniteExecution = true 
関連する問題