【问题标题】:How to transform an observable (A) that emits each second, into an observable that emits a list of elements by A each second如何将每秒发射的 observable (A) 转换为每秒发射 A 元素列表的 observable
【发布时间】:2017-12-14 12:17:33
【问题描述】:

给定一个每秒发出字符串的 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: +)

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

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

有什么想法吗?

【问题讨论】:

    标签: reactive-programming rx-swift reactive


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:
      Observable.timer(1, TimeUnit.SECONDS);  // Replace 1 second with your time if want to emit on other interval.
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-11
        • 1970-01-01
        • 2018-11-25
        相关资源
        最近更新 更多