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

时间:2017-12-12 20:47:17

标签: reactive-programming rx-swift reactive

给定一个每秒钟发出一个字符串的observable,我需要另一个observable来收集这些元素并每秒发出一个完整的列表。

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: +)

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

问题是我只在完成后才看到的完整元素列表。我没有每秒都收到一份新名单。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

以上方法可用于频繁发射。