可观察的订阅总是一次发出
Posted
技术标签:
【中文标题】可观察的订阅总是一次发出【英文标题】:Observable subscribe alway once issue 【发布时间】:2018-05-17 13:08:01 【问题描述】:我为 RxSwift 编写异步单元测试,这是我的代码,我无法理解只订阅一次
class TestViewModel: NSObject
let result : Observable<Int>
init(input:Observable<Int>)
result = input.flatMapLatest( (value) -> Observable<Int> in
return Observable.create( (observer) -> Disposable in
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1, execute:
print("next"+" \(value)")
observer.onNext(value)
)
return Disposables.create()
)
)
func testCount()
let expectation = XCTestExpectation(description: "async")
let input = scheduler.createHotObservable([.next(100, 1),.next(200, 10)])
let viewModel = TestViewModel.init(input: input.asObservable())
viewModel.result.subscribe(onNext: (value) in
print("subscribe"+" \(value)")
).disposed(by: disposeBag)
scheduler.start()
wait(for: [expectation], timeout: timeout)
打印信息:
next 1
next 10
subscribe 10
我认为打印信息应该:
next 1
next 10
subscribe 1
subscribe 10
有人可以给我建议吗?谢谢
【问题讨论】:
因为flatMapLatest
。您可以立即将 flatMap 值转换为延迟的 observables。通过使用 flatMapLatest 你告诉你只需要最新的 Observable 的结果,而最新的是 10 延迟 1 秒。另外,我建议使用 Observable.timer 而不是 asyncAfter
@MaximKosov 谢谢!你解决了我的问题
【参考方案1】:
这就是flatMapLatest
运算符的工作原理。它基本上告诉“将事件映射到可观察对象但仅使用最近的可观察对象的结果”。因此,您将事件映射到两个可观察对象:
1: --1sec-> 1
10: --1sec-> 10
目前最近可观察到的是 10。
尝试使用flatMap
而不是flatMapLatest
。
如果可能,您还应该避免使用Observable.create
。在您的特定情况下(延迟一个值),您可以使用Observable.timer
或Observable.just(...).delay(...)
。
【讨论】:
以上是关于可观察的订阅总是一次发出的主要内容,如果未能解决你的问题,请参考以下文章
一个可作为 ReplaySubject 但仅适用于第一个订阅者的 Rx 可观察对象?