首页 > 解决方案 > 在publishedSubject 上使用.startWith 和在publishedSubject 上使用.onNext 之间的区别

问题描述

是否有任何理由使用 startWith 在主题上发出事件

let publishedSubject1 = PublishedSubject<Void>()
publishedSubject1
    .startWith(Void())
    .subscribe()
    .dispose(by: bag)

与仅使用 .onNext 相比

let publishedSubject2 = PublishedSubject<Void>()
publisedSubject2
    .subscribe()
    .dispose(by: bag)
publishedSubject2.onNext(Void())

这只是那些 Rx 技巧之一,只是以不同的风格方式做同样的事情,就像 .map 用于通过在 map 运算符中移动订阅来隐藏嵌套订阅一样?我在这里查看了代码:https ://github.com/ReactiveX/RxSwift/blob/master/RxSwift/Observables/StartWith.swift这似乎是另一个技巧。是否有使用 .startWith 而不是 .onNext 的功能性原因?

标签: rx-swift

解决方案


[主题] 是 Rx 世界的“可变变量”,在大多数情况下您不需要它们。通常使用 Create 或其他运算符的解决方案允许您只连接延续而不添加额外的状态。

——埃里克·梅杰

使用更具声明性的解决方案使您有机会根本不使用主题。换句话说,使用 Subject 并手动调用onNext与仅调用带有参数的函数并没有太大区别,因此,如果您坚持使用 Subjects,即使您不必这样做,那为什么还要使用 Rx 呢?


推荐阅读