RxSwift Subject

188 阅读2分钟

PublishSubject: 看过http://www.jianshu.com/p/77ad1615c380 该文章写的很好 我写的不过的是很小的补充而已

PublishSubject.png
当时查看的时候看见这张图也不是很明白的 大致的意思我明白 不过这张图并没有明确表明当subscribe在不同的地方时 调用的顺序那么我也来一张图 结合PublishSubject.png这张图来看的话 PublishSubject的功能就更加的明白了

PublishSubject_Add.png
那么程序中的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按先后顺序排列起来 信号源就形象为这个样子

signal.png
在根据subscribe的先后顺序排列

a.png
根据PublishSubject_Add.png的逻辑 不难推测出所有的打印顺序为 subscribe1: a subscribe1: b subscribe1: c subscribe2: c subscribe3: c subscribe1: d subscribe2: d subscribe3: d 果然实际的打印顺序也跟我们的推测是一致的

result.png
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之前几个,并且从该信号开始监听 信号流情况

signal.png
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则会监听初始化的值