【问题标题】:flatMap() called twice on single eventflatMap() 在单个事件中调用两次
【发布时间】:2016-04-23 22:49:55
【问题描述】:

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

视图控制器:

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() 被调用了两次。我已经通过使用打印1var count = 1; stream.subscribeNext { _ in print(count++) } 检查了这一事实。

知道为什么subscribeNext() 在每个事件上触发一次但flatMap() 触发两次吗?

【问题讨论】:

    标签: swift mvvm swift2 rx-swift


    【解决方案1】:

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

    如果您希望它被调用一次,请使用shareReplay(1)

    【讨论】:

    • 谢谢 :) 我没有意识到我的 ViewModel 仍然生活在场景变化中,因为它们只是相互堆叠,并且当前场景正在发出 ExampleViewModel 订阅的事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2022-01-19
    • 1970-01-01
    • 2022-08-20
    • 2014-01-24
    相关资源
    最近更新 更多