如何将每秒发射的可观察对象 (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.
以上方法可用于频繁发射
给定一个每秒发出字符串的可观察对象,我需要另一个收集这些元素并每秒发出完整列表的可观察对象。
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.
以上方法可用于频繁发射