RxSwift: Subject

作者: BetrayalPromise | 来源:发表于2016-11-01 11:25 被阅读41次

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

    相关文章

      网友评论

        本文标题:RxSwift: Subject

        本文链接:https://www.haomeiwen.com/subject/dmlmuttx.html