给定一个每秒钟发出一个字符串的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: +)
其中+是在数组中插入元素的函数。
问题是我只在完成后才看到的完整元素列表。我没有每秒都收到一份新名单。
有什么想法吗?
答案 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.
以上方法可用于频繁发射。