美文网首页
Subject 学习

Subject 学习

作者: 搞好关系 | 来源:发表于2020-12-06 19:43 被阅读0次

Subjects 基本介绍

Subjects自身即是订阅者,也是Observable

.因为自身能够动态接收新的值,因此说是订阅者
.自身有了新值之后,它能通过Event发送给订阅者,因此是Observable

总共4种PublishSubject BehaviorSubject ReplaySubject BehaviorRelay

PublishSubject

只会把订阅者订阅之后的消息发送给对应的订阅者,因此每个订阅者只能接收到自己订阅点开始之后的Event

  func subjectTest() {
        
        subject.onNext("1111")
        
        subject.subscribe { string in
            print("第1次订阅:", string)
        } onCompleted: {
            print("第1次订阅:onCompleted")
        }.disposed(by: disposeBang)

        subject.onNext("22222")
        
        subject.subscribe { string in
            print("第二次订阅",string)
        } onCompleted: {
            print("第二次订阅 onCompleted")
        }.disposed(by: disposeBang)
        subject.onNext("3333")
        subject.onCompleted()
        subject.onNext("444")

    }
publish subject
. subject.onNext("22222")
此时只有第一个订阅者
.subject.onNext("3333")
此时有两个订阅者,分别发送给两个订阅者
.subject.onCompleted
此时宣告Subjects结束,发送完complete事件给所有的接收者自身结束,不再发送任何事件

BehaviorSubject

.需要使用默认值进行初始化作为最新的Event,当有订阅者时会把最新的那个Event发送给订阅者
.每次发送Event之后会把最新的Event持有

    let subject = BehaviorSubject(value: "000")

        subject.onNext("1111")
        subject.subscribe { string in
            print("第1次订阅:", string)
        } onCompleted: {
            print("第1次订阅:onCompleted")
        }.disposed(by: disposeBang)
        subject.onNext("22222")
        subject.subscribe { string in
            print("第二次订阅",string)
        } onCompleted: {
            print("第二次订阅 onCompleted")
        }.disposed(by: disposeBang)
        subject.onNext("3333")
        subject.onCompleted()
        subject.onNext("444")
        subject.onNext("555")
BehaviorSubject
. 发送事件“1111”,之后Subjects持有最新的 1111,订阅时发送给订阅者
. subject.onNext("22222") Subjects刷新,同时发送给订阅者
. 第二个订阅者到来,单独把最新的事件发送给订阅者
.subject.onNext("3333")把Event发送给当前所有的订阅者
.subject.onCompleted()通知所有接收者事件广播结束,不再发送后续所有事件,释放订阅者

ReplaySubject

此Subject比较特殊,是PublishSubject和BehaviorSubject的结合体,结合二者特性
. 使用buffer作为缓冲区…将最新的放入buffer中,不足时淘汰最旧的数据
.订阅时将buffer中的数据立即发送给订阅者
.新的.next会被发送给当前所有的订阅者
.订阅者订阅一个结束的ReplaySubject会受到buffer中的.next,同时会受到结束的.complete或者error

    let replaySubject = ReplaySubject<String>.create(bufferSize: 2)

 replaySubject.onNext("1111")
        replaySubject.onNext("2222")
        replaySubject.onNext("33333")
        
        replaySubject.subscribe { event in
            print("第一次订阅",event)
        }.disposed(by: disposeBang)
        
        replaySubject.onNext("44444444")
        
        replaySubject.subscribe { event in
            print("第二次订阅",event)
        }.disposed(by: disposeBang)
        replaySubject.onCompleted()
        replaySubject.subscribe { event in
            print("第三次订阅")
        }.disposed(by: disposeBang)
        replaySubject.onNext("555555")
image.png

.初始时发送3个.next,此时bufferSize =2因此缓存2 3
. 第一个订阅时将buffer中存储的Event发送给订阅者打印 2 3
.发送 .next 4,刷新buffer为 3 4,同时把 4 发送给订阅者打印 4
. 第二个订阅者到来,将buffer中 3 4 发送给订阅者 打印 3 4
. 发送replaySubject.onCompleted()事件给当前所有订阅者
. 第三个订阅者到来Subjects已经结束,因此发送buffer和.complete

BehaviorRelay

相关文章

  • Subject 学习

    Subjects 基本介绍 Subjects自身即是订阅者,也是Observable .因为自身能够动态接收新的值...

  • RxSwift学习(Subject)

    推荐书本:RxSwift电子版地址:https://pan.baidu.com/s/1bp8MlC7 ...

  • RxJS Subject学习

    一个Observable的例子 输出 可以看到 Observable 对象可以被重复订阅。 Observable ...

  • RxJava学习(1)-Subject

    前言 根据Froussios英文版的学习笔记,这里是简单的学习笔记。如果对于subject的文档看不懂,可以进入这...

  • RxJava2.0----Subject&Observe

    Subject/Observer Subject/Observer模式,Subject翻译为主题 , Subjec...

  • RAC flattenMap

    flattenMap: RACSubject * subject = [RACSubject subject]; ...

  • shiro介绍

    Subject主体,代表了当前“用户,所有Subject都绑定到SecurityManager,与Subject的...

  • vue专题

    学习地址https://www.awesomes.cn/subject/vue https://github.co...

  • Subject

    subject即是被观察者也是观察者。 Subject类型 PublishSubject 没有初始值,要先订阅,才...

  • Subject

    PublishSubject 是Observable的子类 var publishSubject = Publis...

网友评论

      本文标题:Subject 学习

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