美文网首页
RxSwift<10>—— Subject即攻也守

RxSwift<10>—— Subject即攻也守

作者: Gollum_ | 来源:发表于2019-10-21 10:37 被阅读0次

Subject既可以做序列,也可以做观察者
攻守兼备

首先我们来看看:SubjectType的原理!

public protocol SubjectType : ObservableType {
      // 关联了观察者类型,具备这个类型的能力
    associatedtype SubjectObserverType : ObserverType
    func asObserver() -> SubjectObserverType
}
  • SubjectType首先就是继承了ObservableType,具有序列特性
  • 关联了观察者类型,具备这个类型的能力
  • 下面我们通过一个具体类型来感受一下subject
// 1:初始化序列
let publishSub = PublishSubject<Int>() 
// 2:发送响应序列
publishSub.onNext(1)
// 3:订阅序列
publishSub.subscribe { print("订阅到了:",$0)}
    .disposed(by: disposbag)
// 再次发送响应
publishSub.onNext(2)
publishSub.onNext(3)
  • 很明显能够订阅信号(序列最基本的能力)
  • 能够发送响应,又是观察者的能力
  • 查看底层源码分析


    1.png

各种Subject
PublishSubject
可以不需要初始来进行初始化(也就是可以为空),并且它只会向订阅者发送在订阅之后才接收到的元素

//1:初始化序列
        let publishSub = PublishSubject<Int>()
        // 2:发送响应序列
        publishSub.onNext(1)
        // 3:订阅序列
        publishSub.subscribe{print($0)}
        .disposed(by: disposeBag)
        publishSub.onNext(2)
        publishSub.onNext(3)
  • 信号:1是无法被订阅的,只接受订阅之后的响应


    PublishSubject 流程

BehaviorSubject
通过一个默认初始值来创建,当订阅者订阅BehaviorSubject时,会收到订阅后Subject上一个发出的Event,如果还没有收到任何数据,会发出一个默认值。之后就和PublishSubject一样,正常接收新的事件。

  • 和publish 稍微不同就是behavior这个家伙有个存储功能:存储上一次的信号
let behaviorSub = BehaviorSubject.init(value: 100)
        
        behaviorSub.onNext(101)
        behaviorSub.onNext(102)
        behaviorSub.subscribe{print($0)}.disposed(by: disposeBag)
        behaviorSub.onNext(103)
        behaviorSub.onNext(104)
        behaviorSub.subscribe{print($0)}.disposed(by: disposeBag)
  • 当没有信号的时候,会默认发送 信号:100
  • 只能储存一个信号:信号2 会被 信号3 覆盖
  • 订阅信号之前能够储存信号


    BehaviorSubject 流程

ReplaySubject
ReplaySubject 发送源Observable 的所有事件无论observer什么时候开始订阅。

// 1:创建序列
let replaySub = ReplaySubject<Int>.create(bufferSize: 2)
// let replaySub = ReplaySubject<Int>.createUnbounded()

// 2:发送信号
replaySub.onNext(1)
replaySub.onNext(2)
replaySub.onNext(3)
replaySub.onNext(4)

// 3:订阅序列
replaySub.subscribe{ print("订阅到了:",$0)}
    .disposed(by: disposbag)
// 再次发送
replaySub.onNext(7)
replaySub.onNext(8)
replaySub.onNext(9)
  • 一个bufferSize空间,想存储多少次响应就是多少次
  • 其他流程照旧
  • 源码里面就是相对于BehaviorSubject的储存属性变成了集合
    replaySubject 流程
    之前使用Variable非常顺手,但目前已被废弃,需使用BehaviorReplay代替
  • 替换原来的Variable
  • 可以储存一个信号
  • 随时订阅响应
  • 响应发送的时候要注意:behaviorR.accept(20)
let behaviorRelay = BehaviorRelay(value: 100)
behaviorRelay.subscribe(onNext: { (num) in
    print(num)
.disposed(by: disposbag)
print("打印:\(behaviorRelay.value)")

behaviorRelay.accept(1000)

相关文章

网友评论

      本文标题:RxSwift<10>—— Subject即攻也守

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