如何将每秒发射的可观察对象 (A) 转换为每秒发射 A 元素列表的可观察对象

How to transform an observable (A) that emits each second, into an observable that emits a list of elements by A each second

给定一个每秒发出字符串的可观察对象,我需要另一个收集这些元素并每秒发出完整列表的可观察对象。

func oneAtATime() -> Observable<String> {
    return Observable.create{ observable in
        DispatchQueue.global().async {
            let main = DispatchQueue.main

            for i in 0..<10 {

                sleep(1)

                main.async{
                    observable.onNext("Element\(i)")
                }
            }

            main.async{
                observable.onCompleted()
            }
        }

        return Disposables.create()
    }
}

这是我目前拥有的:

let oneEverySecond = oneAtATime()

var accEverySecond : Observable<[String]> = oneEverySecond.reduce([],accumulator: +)

其中 + 是一个在数组中插入元素的函数。

问题是我只在完成后才看到完整的元素列表 。我不是每秒都收到新列表。

有什么想法吗?

确实,.reduce() 仅在完成时触发。只需将其替换为 .scan(),它将在每个上游事件上触发。

顺便说一句,为什么不使用 Observable.timer() 而不是自定义 observable?

Observable.timer(1, TimeUnit.SECONDS);  // Replace 1 second with your time if want to emit on other interval.

以上方法可用于频繁发射