RxSwift:重复一个(完成的)流
RxSwift: Repeat a (completed) stream
假设我有一个可用于启动和停止(切换)操作的按钮。
let toggleStream: Observable<Bool> = toggleBtn.rx.tap.scan(false) { state, _ in !state }
我有另一个流,它连续发出整数。
let emitter = Observable<Int>.interval(2.0, scheduler: timerScheduler)
现在我想使用切换流来启动和停止第二个流的发射。这是我的方法:
Observable.combineLatest(toggleStream, emitter) { shouldEmit, evt in
return (shouldEmit, evt)
}.takeWhile{ (shouldEmit, evt:Int) in
return shouldEmit == true
}.map {(_, evt) in
return evt
}
这是第一次很好用。我可以按下按钮,Observable
开始发射它的 Ints
。也停止工作。遗憾的是我无法第二次启动它,因为流已完成。当用户再次切换按钮时,我如何 restart/retry/repeat 它?
这是我在操场上的做法。您应该能够推断:
//: 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 { [=10=] }
.flatMapLatest { _ in
Observable<Int>.interval(2.0, scheduler: MainScheduler.instance)
.takeUntil(toggleStream.filter { ![=10=] })
}
_ = emit.subscribe( {
print([=10=])
})
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
假设我有一个可用于启动和停止(切换)操作的按钮。
let toggleStream: Observable<Bool> = toggleBtn.rx.tap.scan(false) { state, _ in !state }
我有另一个流,它连续发出整数。
let emitter = Observable<Int>.interval(2.0, scheduler: timerScheduler)
现在我想使用切换流来启动和停止第二个流的发射。这是我的方法:
Observable.combineLatest(toggleStream, emitter) { shouldEmit, evt in
return (shouldEmit, evt)
}.takeWhile{ (shouldEmit, evt:Int) in
return shouldEmit == true
}.map {(_, evt) in
return evt
}
这是第一次很好用。我可以按下按钮,Observable
开始发射它的 Ints
。也停止工作。遗憾的是我无法第二次启动它,因为流已完成。当用户再次切换按钮时,我如何 restart/retry/repeat 它?
这是我在操场上的做法。您应该能够推断:
//: 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 { [=10=] }
.flatMapLatest { _ in
Observable<Int>.interval(2.0, scheduler: MainScheduler.instance)
.takeUntil(toggleStream.filter { ![=10=] })
}
_ = emit.subscribe( {
print([=10=])
})
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