【发布时间】: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 谢谢!你解决了我的问题