flatMap()在单个事件上调用两次

时间:2016-01-18 17:07:09

标签: swift mvvm swift2 rx-swift

我有一个ViewController,其中init()我使用PublishSubject创建热流。然后我使用ViewModel中的stream.asObservable()将流传递到我的viewDidLoad(),因为ViewModel具有其他依赖项,这些依赖项是从视图生成的流,所以它必须等待直到在创建ViewModel之前完成视图的绑定。在创建ViewModel之后,我将ViewController中的事件推送到流中,然后期望ViewModel通过触发异步请求(也已用Rx包装)来对事件做出反应。

的ViewController:

class ExampleViewController: ViewController {

    ....

    private let exampleStream: PublishSubject<Bool>

    init() {
        self.exampleStream = PublishSubject<Bool>()
    }

    viewDidLoad() {
        self.viewModel = viewModelFactory.create(exampleStream.asObservable())
        self.exampleStream.onNext(true)
    }

    ....
}

视图模型:

class ExampleViewModel {

    init(stream: Observable<Bool>) {
        stream.flatMap { _ in
            doSomethingAsyncThatReturnsAnObservable()
        }
    }

    private func doSomethingAsyncThatReturnsAnObservable() -> Observable<CustomObject> { ... }
}

我的问题是,当流中只有一个事件时,doSomethingAsyncThatReturnsAnObservable()被调用两次。我使用打印var count = 1; stream.subscribeNext { _ in print(count++) }的{​​{1}}检查了这一事实。

为什么1会在每个事件中触发一次,但subscribeNext()两次触发?

1 个答案:

答案 0 :(得分:3)

这是因为flatMap调用了每个订阅。

如果您希望在使用shareReplay(1)

后调用它