RxSwift (2) Subject

9 篇文章 0 订阅

Subject简述

  • 既可以作为观察量序列(Observable),也可以作为观察者(observer)
  • 作为观察量序列的时候,将Observable里面 订阅的发送信号事件序列 剥离出来了,进行先订阅,后实现订阅的事件序列,也就是发送信号啦。
  • 作为观察者,就是实现发送信号。看下面的例子吧

PublishSubject

订阅之后 ,才开始发送信号

func rx_PublishSubject(){
        // 创建rx 回收管理
        let disposeBag = DisposeBag()
        let subject = PublishSubject<Int>()//<填观察的类型>;这是创建方法,command点进可以看到

        // 作为观察量序列,去订阅还未实现的 观察序列,但是值类型是知道的,就是<这个类型>
        subject.subscribe{print("作为一个观察量序列,这个序列只有打印事件,接收的信号是:\($0)")}.addDisposableTo(disposeBag)

        // 作为观察者,实现 发送信号的观察序列
        subject.onNext(1)
        subject.onNext(2)

        subject.subscribe(onNext: { k in
            print("2个序列,接收的信号是:\(k)")
        },  onCompleted: { 
            print("完成了")
        }) { 
            print("结束")
        }.addDisposableTo(disposeBag)


        subject.onNext(9)
        subject.onCompleted()
    }

ReplaySubject

ReplaySubject 在新的订阅出现的时候会补发前几条数据, bufferSize控制着具体补发前边几条数据 , 1就是补发一条, 2就是补发两条, 以此类推,补发的顺序按照顺序 倒数条数,例如123,size=2,补发23

func rx_RePlaySubject(){
        let disposeBag = DisposeBag()
        // 创建
        let subject = ReplaySubject<String>.create(bufferSize: 1)
        // 观察量序列 去订阅
        subject.subscribe {
            print("打印订阅——1:\($0)")
            }.addDisposableTo(disposeBag)

        // 观察者 发送序列信号
        subject.onNext("小美")
        subject.onNext("小惠")
        subject.onNext("小花")

        //新的订阅
        subject.subscribe{
            print("新的订阅——2:\($0)")}.addDisposableTo(disposeBag)

        // 发送信号
        subject.onNext("明明")
        subject.onNext("东东")
    }

// 打印结果:在正常的订阅基础上,新增订阅补发信号
//打印订阅——1:next(小美)
//打印订阅——1:next(小惠)
//打印订阅——1:next(小花)
//新的订阅——2:next(小花)   这里是在补发数据,创建的时候填写的1,所以补发一条
//打印订阅——1:next(明明)
//新的订阅——2:next(明明)
//打印订阅——1:next(东东)
//新的订阅——2:next(东东)

BehaviorSubject

上面一个例子是新的订阅会补发size条信号
这里是有订阅的时候会补发最近一条信号,如果是第一个订阅则补发预设的默认值

 func rx_BehaviorSubject() {
        let disposeBag = DisposeBag()
        let subject = BehaviorSubject(value: "o")

        subject.subscribe{print("1——\($0)")}.addDisposableTo(disposeBag)
        subject.onNext("a")
        subject.onNext("s")

        subject.subscribe{print("2——\($0)")}.addDisposableTo(disposeBag)
        subject.onNext("d")
        subject.onNext("f")

        subject.subscribe{print("3——\($0)")}.addDisposableTo(disposeBag)
        subject.onNext("g")
        subject.onNext("h")
    }

*Variable*

Variable 比较特殊,是一个最终类,没有任何继承,所以它不是观察量序列 也不是观察者,不过类里面有相应的方法转换,具体看下面例子

那Variable的效果是什么呢,和上一个例子(订阅的时候会补发最近一条信号,如果是第一个订阅则补发预设的默认值)一样,当然多了点东西,它不是observe、Observable,所以没有观察者事件,也就是发送信号,所以Variable执行完,封装好了自动发送completed信号

func rx_Variable(){
        let disposeBag = DisposeBag()

        //创建
        let subject = Variable<String>("默认")

        // 本身没有继承自观察量序列(Observable),asObservable()返回观察量序列 订阅
        subject.asObservable().subscribe{print("event1——\($0)")}.addDisposableTo(disposeBag)

        // 发信号,本身不是订阅者,不能调用on方法,点进去,是设置value属性
        subject.value = "第一次"
        subject.value = "第二次"

        subject.asObservable().subscribe{print("event2——\($0)")}.addDisposableTo(disposeBag)
        subject.value = "第三次"
        subject.value = "第四次"

        subject.asObservable().subscribe{print("event3——\($0)")}.addDisposableTo(disposeBag)
        subject.value = "第五次"
        subject.value = "第六次"
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值