RxSwift:重复(完成)流

Posted

技术标签:

【中文标题】RxSwift:重复(完成)流【英文标题】:RxSwift: Repeat a (completed) stream 【发布时间】:2017-04-26 22:18:12 【问题描述】:

假设我有一个可用于启动和停止(切换)动作的按钮。

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。也停止工作。可悲的是,我无法再次启动它,因为流已完成。当用户再次切换按钮时,如何重新启动/重试/重复?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于RxSwift:重复(完成)流的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift - 执行控制流会导致异步操作被执行两次

RxSwift observable 创建,它采用流本身的最后一个值

RxSwift 和控制流 - 一个坏主意?

RxSwift安装

RxSwift安装

在 RxSwift 中设置 TextField 字符的限制 [重复]