swift3 - RxSwift : Repeat a (completed) stream

标签 swift3 observable rx-swift reactivex rx-cocoa

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

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

最佳答案

这是我在 Playground 上的做法。您应该能够推断:

//: 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

关于swift3 - RxSwift : Repeat a (completed) stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43645451/

相关文章:

observablecollection - 我可以随机化 ObservableCollection 中的项目序列吗?

javascript - Angular 7 map 运算符无法与 httpClient Observable 一起使用

ios - 驱动程序未更新为最新值

ios - iOS使用RxSwift跟踪异步网络调用何时完成

ios - 处理 launchOptions 时的 RxSwift FirebaseDatabase 快照 <null>?[UIApplicationLaunchOptionsKey.remoteNotification]

ios - 如何使用 Swift 制作项目符号列表?

ios - 带有图像、Swift 3 和核心数据的自定义单元格的缓慢 Tableview

javascript - 可观察事件限制/在内存中只保留一个事件/背压

ios - Xcode无法运行iOS模拟器

ios - 无效的浮点值 - swift 3 ios