美文网首页
Subjects 基本介绍

Subjects 基本介绍

作者: adaodao3056 | 来源:发表于2020-12-22 09:26 被阅读0次

一共有四种 Subjects,分别为:PublishSubject、BehaviorSubject、ReplaySubject、Variable。他们之间既有各自的特点,也有相同之处:

1.首先他们都是 Observable,他们的订阅者都能收到他们发出的新的 Event。
2.直到 Subject 发出 .complete 或者 .error 的 Event 后,该 Subject 便终结了,同时它也就不会再发出 .next 事件。
3.对于那些在 Subject 终结后再订阅他的订阅者,也能收到 subject 发出的一条 .complete 或 .error 的 event,告诉这个新的订阅者它已经终结了。
4.他们之间最大的区别只是在于:当一个新的订阅者刚订阅它的时候,能不能收到 Subject 以前发出过的旧 Event,如果能的话又能收到多少个。

Subject 常用的几个方法:

onNext(:):是 on(.next(:)) 的简便写法。该方法相当于 subject 接收到一个 .next 事件。
onError(:):是 on(.error(:)) 的简便写法。该方法相当于 subject 接收到一个 .error 事件。
onCompleted():是 on(.completed) 的简便写法。该方法相当于 subject 接收到一个 .completed 事件。

PublishSubject

PublishSubject :
1.不需要初始值就能创建。
2.PublishSubject 的订阅者从他们开始订阅的时间点起,可以收到订阅后 Subject 发出的新 Event,而不会收到他们在订阅前已发出的 Event。

BehaviorSubject

1.BehaviorSubject 需要通过一个默认初始值来创建
2.当一个订阅者来订阅它的时候,这个订阅者会立即收到 BehaviorSubjects 上一个发出的 event。之后就跟正常的情况一样,它也会接收到 BehaviorSubject 之后发出的新的 event。

ReplaySubject

ReplaySubject 在创建时候需要设置一个 bufferSize,表示它对于它发送过的 event 的缓存个数。
比如一个 ReplaySubject 的 bufferSize 设置为 2,它发出了 3 个 .next 的 event,那么它会将后两个(最近的两个)event 给缓存起来。此时如果有一个 subscriber 订阅了这个 ReplaySubject,那么这个 subscriber 就会立即收到前面缓存的两个 .next 的 event。
如果一个 subscriber 订阅已经结束的 ReplaySubject,除了会收到缓存的 .next 的 event 外,还会收到那个终结的 .error 或者 .complete 的 event。

Variable

Variable 其实就是对 BehaviorSubject 的封装,所以它也必须要通过一个默认的初始值进行创建。
Variable 具有 BehaviorSubject 的功能,能够向它的订阅者发出上一个 event 以及之后新创建的 event。
不同的是,Variable 还把会把当前发出的值保存为自己的状态。同时它会在销毁时自动发送 .complete 的 event,不需要也不能手动给 Variables 发送 completed 或者 error 事件来结束它。
简单地说就是 Variable 有一个 value 属性,我们改变这个 value 属性的值就相当于调用一般 Subjects 的 onNext() 方法,而这个最新的 onNext() 的值就被保存在 value 属性里了,直到我们再次修改它。
备注:Variables 本身没有 subscribe() 方法,但是所有 Subjects 都有一个 asObservable() 方法。我们可以使用这个方法返回这个 Variable 的 Observable 类型,拿到这个 Observable 类型我们就能订阅它了。

BehaviorRelay

BehaviorRelay 是作为 Variable 的替代者出现的。它的本质其实也是对 BehaviorSubject 的封装,所以它也必须要通过一个默认的初始值进行创建。
BehaviorRelay 具有 BehaviorSubject 的功能,能够向它的订阅者发出上一个 event 以及之后新创建的 event。
与 BehaviorSubject 不同的是,不需要也不能手动给 BehaviorReply 发送 completed 或者 error 事件来结束它(BehaviorRelay 会在销毁时也不会自动发送 .complete 的 event)。
BehaviorRelay 有一个 value 属性,我们通过这个属性可以获取最新值。而通过它的 accept() 方法可以对值进行修改。

备注:如果想将新值合并到原值上,可以通过 accept() 方法与 value 属性配合来实现。(这个常用在表格上拉加载功能上,BehaviorRelay 用来保存所有加载到的数据)

相关文章

  • Subjects 基本介绍

    一共有四种 Subjects,分别为:PublishSubject、BehaviorSubject、ReplayS...

  • Subject 学习

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

  • 5. RxSwift 发送、订阅 Subjects、Variab

    Subjects 介绍 1. Subjects 是订阅者,也是Observable 订阅者:它能动态的接收新的值。...

  • iOS 【Swift-PublishSubject、AsyncS

    Subjects 介绍 Subjects 是订阅者,也是Observable:订阅者:它能动态的接收新的值。Obs...

  • Subjects And Variables

    Subjects 1、Subjects 既是订阅者,也是 Observable 2、一共有四种 Subjects,...

  • 英语流利说-Level2·Unit3·Part4-School

    School Subjects Here are some school subjects. In science...

  • RxSwift4-Subjects介绍

    看了前面介绍的创建Observable的方式, 我们应该会想,在项目的实际使用中,大多数情况都是预先不知道序列值的...

  • R语言入门2:数据结构-1

    1.对象和属性 在R中有5种基本的对象类型(classes of subjects): 字符:character,...

  • RxSwift笔记 - Subjects

    Subjects既是订阅者Observer,也是可观察序列Observable。 一共有四种 Subjects,分...

  • Subjects

    一个Subject是一种桥接或者是一种代理,在Rx中不仅可以当作观察者也可以当作可观察者来实现。由于她是一个观察者...

网友评论

      本文标题:Subjects 基本介绍

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