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

标签: swift rx-swift rx-cocoa


【解决方案1】:

这就是flatMapLatest 运算符的工作原理。它基本上告诉“将事件映射到可观察对象仅使用最近的可观察对象的结果”。因此,您将事件映射到两个可观察对象:

1: --1sec-> 1

10: --1sec-> 10

目前最近可观察到的是 10。

尝试使用flatMap 而不是flatMapLatest

如果可能,您还应该避免使用Observable.create。在您的特定情况下(延迟一个值),您可以使用Observable.timerObservable.just(...).delay(...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-30
    • 2017-04-13
    • 2020-09-16
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多