iOS精学选辑iOS进阶指南

RxSwift: Subject

2016-11-01  本文已影响41人  BetrayalPromise

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

上一篇 下一篇

猜你喜欢

热点阅读