PublishSubject:
看过http://www.jianshu.com/p/77ad1615c380 该文章写的很好 我写的不过的是很小的补充而已
当时查看的时候看见这张图也不是很明白的 大致的意思我明白 不过这张图并没有明确表明当subscribe在不同的地方时 调用的顺序那么我也来一张图 结合PublishSubject.png这张图来看的话 PublishSubject的功能就更加的明白了
那么程序中的subscribe调用的顺序我们就总结一下啊
原文中的例子是
func publishSubject() {
let subject: PublishSubject = PublishSubject<String>()
subject.on(.Next("0"))
subject.subscribe { event in
print("1: \(event)")
}.addDisposableTo(disposeBag)
subject.on(.Next("a"))
subject.on(.Next("b"))
subject.subscribe { event in
print("2: \(event)")
}.addDisposableTo(disposeBag)
subject.subscribe { event in
print("3: \(event)")
}.addDisposableTo(disposeBag)
subject.on(.Next("c"))
subject.on(.Next("d"))
}
我们先将所有的的subject.on按先后顺序排列起来 信号源就形象为这个样子
在根据subscribe的先后顺序排列
根据PublishSubject_Add.png的逻辑
不难推测出所有的打印顺序为
subscribe1: a
subscribe1: b
subscribe1: c
subscribe2: c
subscribe3: c
subscribe1: d
subscribe2: d
subscribe3: d
果然实际的打印顺序也跟我们的推测是一致的
ReplaySubject:
PublishSubject的subscribe的监听回调的是监听subscribe之后的.on(xxx)流写在subscribe之前的on(xxx)流的信号是不能够监听到的
func replaySubject() {
let subject: ReplaySubject = ReplaySubject<String>.create(bufferSize: 1)
subject.on(.Next("0"))
subject.on(.Next("1"))
subject.on(.Next("2"))
subject.subscribeNext { (item) in
print("subscribe1: \(item)")
}.addDisposableTo(disposeBag)
subject.on(.Next("a"))
subject.on(.Next("b"))
subject.subscribeNext { (item) in
print("subscribe2: \(item)")
}.addDisposableTo(disposeBag)
subject.on(.Next("c"))
subject.on(.Next("d"))
}
let subject: ReplaySubject = ReplaySubject<String>.create(bufferSize: 1)
其中这句话的意思是监听写在subscribe之前一个的.on(xxx)信号 并且从从这个信号开始监听,这个bufferSize写的是几,就监听从写在subscribe之前几个,并且从该信号开始监听
信号流情况
bufferSize = 1的意思是s1的监听从“1”开始 s2的监听从“b”开始
bufferSize = n 的意思是从s闭包下面第一个.on(xxx)算起向信号流上游数到n的.on(xxx)开始监听,如果上游没有的话就从离闭包最近的.on(xxx)开始监听起
当bufferSize = 0的时候 ReplaySubject与PublishSubject等同
bufferSize >= 0要注意 为负数时没有效果
BehavierSubject:
BehavierSubject 等同于 ReplaySubject设置为bufferSize = 1的情况,但是有个不同点就是 ReplaySubject前面如果没有.on(xxx)信号的话会向信号流下游寻找.on(xxx) 信号而BehavierSubject则会监听初始化的值