RxSwift: Subject

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

RxSwift: Subject_第1张图片
PublishSubject.png

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

RxSwift: Subject_第2张图片
PublishSubject_Add.png

那么程序中的subscribe调用的顺序我们就总结一下啊
原文中的例子是

 func publishSubject() {
        let subject: PublishSubject = PublishSubject()
        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的先后顺序排列

RxSwift: Subject_第3张图片
a.png

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

RxSwift: Subject_第4张图片
result.png

ReplaySubject:
PublishSubject的subscribe的监听回调的是监听subscribe之后的.on(xxx)流写在subscribe之前的on(xxx)流的信号是不能够监听到的

func replaySubject() {
        let subject: ReplaySubject = ReplaySubject.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.create(bufferSize: 1)

其中这句话的意思是监听写在subscribe之前一个的.on(xxx)信号 并且从从这个信号开始监听,这个bufferSize写的是几,就监听从写在subscribe之前几个,并且从该信号开始监听
信号流情况

RxSwift: Subject_第5张图片
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则会监听初始化的值

你可能感兴趣的:(RxSwift: Subject)