Наблюдаемая подписка всегда после выпуска - PullRequest
0 голосов
/ 17 мая 2018

Я пишу асинхронные модульные тесты для 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    

Кто-то может дать мне предложение? спасибо

1 Ответ

0 голосов
/ 17 мая 2018

Так работает оператор flatMapLatest.Он в основном говорит «отображать события в наблюдаемые , но использует только результаты последних наблюдаемых».Итак, вы отображаете ваши события в две наблюдаемые:

1: --1sec-> 1

10: --1sec-> 10

Последние наблюдаемые в данный моментдля 10.

Попробуйте использовать flatMap вместо flatMapLatest.

Вам также следует избегать Observable.create, если это возможно.В вашем конкретном случае (для задержки значения) вы можете использовать Observable.timer или Observable.just(...).delay(...).

...