2017-05-24 7 views
1

私はrunning -> Event completedを見た直後にtimer -> Event completedが出力されることを期待しましたが、それは起こりませんでした。Rx flatMapLatestは完了していませんか?

誰かが理由を説明して、timerをどのように観察できるか考えてもらえますか?

/// playground 

import RxSwift 
import PlaygroundSupport 
PlaygroundPage.current.needsIndefiniteExecution = true 


struct TimerCountdown { 

    let timer: Observable<Int> 

    init(running: Observable<Bool>) { 
     timer = running.flatMapLatest { $0 ? Observable<Int>.interval(1.0, scheduler: MainScheduler.instance) : Observable<Int>.never() } 
    } 

} 

let running = PublishSubject<Bool>() 
let countdown = TimerCountdown(running: running) 

_ = running.debug("running").subscribe() 

_ = countdown.timer.debug("timer").subscribe() 

running.onNext(true) 
DispatchQueue.main.asyncAfter(deadline: .now() + 3.5) { 
    running.onNext(false) 
} 

DispatchQueue.main.asyncAfter(deadline: .now() + 7.5) { 
    running.onNext(true) 
} 

DispatchQueue.main.asyncAfter(deadline: .now() + 10.5) { 
    running.onCompleted() 
} 

答えて

2

これは私が見つけた解決策である:

struct TimerCountdown { 

    let timer: Observable<Int> 

    init(running: Observable<Bool>) { 
     timer = running 
      .flatMapLatest { $0 ? Observable<Int>.interval(1.0, scheduler: MainScheduler.instance) : Observable<Int>.never() 
      } 
      .takeUntil(running.materialize().filter { $0.isCompleted }) 
    } 
} 
関連する問題