Swift3 RxSwift:重复(完成的)流

Swift3 RxSwift:重复(完成的)流,swift3,observable,rx-swift,reactivex,rx-cocoa,Swift3,Observable,Rx Swift,Reactivex,Rx Cocoa,假设我有一个按钮,可以用来启动和停止(切换)一个动作 let toggleStream: Observable<Bool> = toggleBtn.rx.tap.scan(false) { state, _ in !state } 这是第一次非常有效。我可以按下按钮,Observable开始发出它的Ints。也停止工作。遗憾的是,我无法再次启动它,因为流已经完成。当用户再次切换按钮时,我如何重新启动/重试/重复它?以下是我在操场上的操作方式。您应该能够推断: //: Playgro

假设我有一个按钮,可以用来启动和停止(切换)一个动作

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

这是第一次非常有效。我可以按下按钮,
Observable
开始发出它的
Ints
。也停止工作。遗憾的是,我无法再次启动它,因为流已经完成。当用户再次切换按钮时,我如何重新启动/重试/重复它?

以下是我在操场上的操作方式。您应该能够推断:

//: 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
/:操场-名词:人们可以玩耍的地方
导入RxSwift
让toggleButton=PublishSubject()
让toggleStream:Observable=toggleButton
.scan(false){state,{in!state}
.debug()
.shareReplayLatestWhileConnected()
让emit=toggleStream
.filter{$0}
.flatmap最新{uu英寸
可观察的.interval(2.0,调度程序:MainScheduler.instance)
.takeUntil(toggleStream.filter{!$0})
}
_=emit.subscribe({
印刷品(0美元)
})
toggleButton.onNext()
DispatchQueue.main.asyncAfter(截止日期:DispatchTime.now()+5.0){
toggleButton.onNext()
}
DispatchQueue.main.asyncAfter(截止日期:DispatchTime.now()+11.0){
toggleButton.onNext()
}
DispatchQueue.main.asyncAfter(截止日期:DispatchTime.now()+17.0){
toggleButton.onNext()
}
导入PlaygroundSupport
PlaygroundPage.current.NeedsDefiniteExecution=true
Observable.combineLatest(toggleStream, emitter) { shouldEmit, evt in
    return (shouldEmit, evt)
}.takeWhile{ (shouldEmit, evt:Int) in
    return shouldEmit == true
}.map {(_, evt) in
    return evt
}
//: 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