我为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
有人可以给我建议吗?谢谢
答案 0 :(得分:1)
这是Student Name One
Student Name Two
运算符的工作原理。它基本上告诉“将事件映射到observables 但只使用最近的observable的结果”。因此,您将事件映射到两个可观察对象:
1: - 1sec-&gt; 1
10: - 1sec-&gt; 10
目前最近观察到的是10岁。
尝试使用flatMapLatest
代替flatMap
。
如果可能,您还应该避免flatMapLatest
。在您的特定情况下(要延迟值),您可以使用Observable.create
或Observable.timer
。