加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 02:23:57 所属栏目:百科 来源:网络整理
导读:我有一个ViewController,在init()中我使用PublishSubject创建一个热流.然后我使用viewDidLoad()中的stream.asObservable()将流传递给我的ViewModel,因为ViewModel具有其他依赖项,这些依赖项是从视图生成的流,因此它必须等到视图的绑定完成才能创建ViewModel.
我有一个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()被调用两次.我用var count = 1检查了这个事实; stream.subscribeNext {_ in print(count)},打印1.

任何想法为什么subscribeNext()在每个事件上触发一次但flatMap()会触发两次?

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

如果你希望它被调用一次使用shareReplay(1)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读