Subject简述
- 既可以作为观察量序列(Observable),也可以作为观察者(observer)
- 作为观察量序列的时候,将Observable里面 订阅的发送信号事件序列 剥离出来了,进行先订阅,后实现订阅的事件序列,也就是发送信号啦。
- 作为观察者,就是实现发送信号。看下面的例子吧
PublishSubject
订阅之后 ,才开始发送信号
func rx_PublishSubject(){
// 创建rx 回收管理
let disposeBag = DisposeBag()
let subject = PublishSubject<Int>()//<填观察的类型>;这是创建方法,command点进可以看到
// 作为观察量序列,去订阅还未实现的 观察序列,但是值类型是知道的,就是<这个类型>
subject.subscribe{print("作为一个观察量序列,这个序列只有打印事件,接收的信号是:\($0)")}.addDisposableTo(disposeBag)
// 作为观察者,实现 发送信号的观察序列
subject.onNext(1)
subject.onNext(2)
subject.subscribe(onNext: { k in
print("2个序列,接收的信号是:\(k)")
}, onCompleted: {
print("完成了")
}) {
print("结束")
}.addDisposableTo(disposeBag)
subject.onNext(9)
subject.onCompleted()
}
ReplaySubject
ReplaySubject 在新的订阅出现的时候会补发前几条数据, bufferSize控制着具体补发前边几条数据 , 1就是补发一条, 2就是补发两条, 以此类推,补发的顺序按照顺序 倒数条数,例如123,size=2,补发23
func rx_RePlaySubject(){
let disposeBag = DisposeBag()
// 创建
let subject = ReplaySubject<String>.create(bufferSize: 1)
// 观察量序列 去订阅
subject.subscribe {
print("打印订阅——1:\($0)")
}.addDisposableTo(disposeBag)
// 观察者 发送序列信号
subject.onNext("小美")
subject.onNext("小惠")
subject.onNext("小花")
//新的订阅
subject.subscribe{
print("新的订阅——2:\($0)")}.addDisposableTo(disposeBag)
// 发送信号
subject.onNext("明明")
subject.onNext("东东")
}
// 打印结果:在正常的订阅基础上,新增订阅补发信号
//打印订阅——1:next(小美)
//打印订阅——1:next(小惠)
//打印订阅——1:next(小花)
//新的订阅——2:next(小花) 这里是在补发数据,创建的时候填写的1,所以补发一条
//打印订阅——1:next(明明)
//新的订阅——2:next(明明)
//打印订阅——1:next(东东)
//新的订阅——2:next(东东)
BehaviorSubject
上面一个例子是新的订阅会补发size条信号
这里是有订阅的时候会补发最近一条信号,如果是第一个订阅则补发预设的默认值
func rx_BehaviorSubject() {
let disposeBag = DisposeBag()
let subject = BehaviorSubject(value: "o")
subject.subscribe{print("1——\($0)")}.addDisposableTo(disposeBag)
subject.onNext("a")
subject.onNext("s")
subject.subscribe{print("2——\($0)")}.addDisposableTo(disposeBag)
subject.onNext("d")
subject.onNext("f")
subject.subscribe{print("3——\($0)")}.addDisposableTo(disposeBag)
subject.onNext("g")
subject.onNext("h")
}
*Variable*
Variable 比较特殊,是一个最终类,没有任何继承,所以它不是观察量序列 也不是观察者,不过类里面有相应的方法转换,具体看下面例子
那Variable的效果是什么呢,和上一个例子(订阅的时候会补发最近一条信号,如果是第一个订阅则补发预设的默认值)一样,当然多了点东西,它不是observe、Observable,所以没有观察者事件,也就是发送信号,所以Variable执行完,封装好了自动发送completed信号
func rx_Variable(){
let disposeBag = DisposeBag()
//创建
let subject = Variable<String>("默认")
// 本身没有继承自观察量序列(Observable),asObservable()返回观察量序列 订阅
subject.asObservable().subscribe{print("event1——\($0)")}.addDisposableTo(disposeBag)
// 发信号,本身不是订阅者,不能调用on方法,点进去,是设置value属性
subject.value = "第一次"
subject.value = "第二次"
subject.asObservable().subscribe{print("event2——\($0)")}.addDisposableTo(disposeBag)
subject.value = "第三次"
subject.value = "第四次"
subject.asObservable().subscribe{print("event3——\($0)")}.addDisposableTo(disposeBag)
subject.value = "第五次"
subject.value = "第六次"
}